2016-07-29 19 views
3

Ich habe einen Pseudo-Code zur Lösung eines bestimmten Problems in JavaScript, aber ich kann nicht scheinen mein Kopf zu wickeln, wie man es Code zu übersetzen:Verwendung von reinem JavaScript, eine Sammlung von Objekten und ein Filterobjekt gegeben, Rückgabeobjekte in Sammlung mit demselben Schlüssel/Wert-Paar wie das Filterobjekt

var sampleCollection = [ 
    { 'a': 1, 'b': 2, 'c': 3 }, 
    { 'a': 4, 'b': 5, 'c': 6 } 
]; 

var sampleFilter = { 'a': 4, 'c': 6 }; 

function getCollectionFilter(collection,filter) { 
    function collectionFilter(collection,filter) { 
    //return if for each element in filter, 
    //collection's key/value pair is same with filter's key/value pair 
    } 

    return collection.filter(collectionFilter); 
} 

getCollectionFilter(sampleCollection,sampleFilter); 
// -> { 'a': 4, 'b': 5, 'c': 6}; 

ich denke lodash die _.matches dieses Problem zu lösen, aber ich würde gerne wissen, warum die Dinge auf eine bestimmte Weise getan werden und was sind die Auswirkungen/Konsequenzen, wenn es anders geht.

Bonus für den Kontext in der realen Welt zu geben, warum eine Lösung/Praxis ist "beste"

+0

Warum würde dieser Filter auch zurück "b": 5? – Aeolingamenfel

+0

@Aeolingamenfel weil die 'a' und' c' Werte übereinstimmen? – Pureferret

+0

Oh, ok, ich habe falsch verstanden, wie der Filter funktioniert. – Aeolingamenfel

Antwort

3

Verwenden Array#filter und Array#every Methoden

var sampleCollection = [{ 
 
    'a': 1, 
 
    'b': 2, 
 
    'c': 3 
 
}, { 
 
    'a': 4, 
 
    'b': 5, 
 
    'c': 6 
 
}]; 
 

 
var sampleFilter = { 
 
    'a': 4, 
 
    'c': 6 
 
}; 
 

 
function getCollectionFilter(collection, filter) { 
 
    // filter out elements and return 
 
    return collection.filter(function(v) { 
 
    // get all object keys 
 
    return Object.keys(filter) 
 
     // use `every` method and check all values are equal 
 
     .every(function(k) { 
 
     // compare values 
 
     return filter[k] == v[k]; 
 
     }); 
 
    }) 
 
} 
 
console.log(
 
    getCollectionFilter(sampleCollection, sampleFilter) 
 
);


Mit ES6 arrow function können Sie eine Zeile machen.

var sampleCollection = [{ 
 
    'a': 1, 
 
    'b': 2, 
 
    'c': 3 
 
}, { 
 
    'a': 4, 
 
    'b': 5, 
 
    'c': 6 
 
}]; 
 

 
var sampleFilter = { 
 
    'a': 4, 
 
    'c': 6 
 
}; 
 

 
function getCollectionFilter(collection, filter) { 
 
    return collection.filter(v => Object.keys(filter).every(k => filter[k] == v[k])) 
 
} 
 
console.log(
 
    getCollectionFilter(sampleCollection, sampleFilter) 
 
);

+0

Briefest ist: http://stackoverflow.com/a/38664372/747579 –

0

Ähnlich Pranav C Balan Antwort (schlagt mich auf den Stempel) ... Ich bin nur ein Filter-Fabrik für die Erstellung von Funktionen zu Array.prototype.filter eher passieren als die Sammlung erforderlich als ein Parameter und eine Vor-Schleife-Prüfung auf das Vorhandensein von übereinstimmenden Schlüsseln vor dem tatsächlichen Vergleichen von Werten.

let filterer = test => { 
    let keys = Object.keys(test).sort(); 
    let keyMatch = new RegExp(keys.toString); 
    return obj => { 
    let objKeys = Object.keys(obj).sort().toString(); 
    return objKeys.match(keyMatch) && keys.every(k => test[k] === obj[k]); 
    } 
}; 

let passes = arrOfObjects.filter(filterer(testCase)); 
+0

Danke für die zusätzliche Antwort. Pranavs Antwort war eine kurze Bearbeitung meines Codes, damit es funktioniert. Ich habe festgestellt, dass Sie ES6-Funktionen verwenden. Wie vergleicht sich das im Hinblick auf Leistung, Skalierbarkeit und Lesbarkeit (Stilübernahme) im Vergleich zu dem oben genannten? Ich habe keine Produktionserfahrung, deshalb bin ich neugierig auf reale Praktiken und nicht auf isolierte Algorithmen, denen ich bisher ausgesetzt war. – jpls93

+0

@John hängt davon ab, ob die ES6 nativ oder transpiliert ist. Ich kann Ihnen sagen, dass der Quellcode (nach meiner Erfahrung aus der Portierung von Projekten nach ES 6) insgesamt 25 bis 30% kürzer ist. In Bezug auf reale Praktiken sind AFAIK ES 6/Babel oder Typescript (die den gleichen Core-js-Transpiler wie Babel verwenden) ziemlich Standard. In Bezug auf perf, ich habe es nicht profiliert, aber es sei denn, es ist in einer heißen Schleife sollte es nicht einmal eine Größenordnung Unterschied machen. –

+0

Briefest ist: http://stackoverflow.com/a/38664372/747579 –