2016-11-16 4 views
0
definiert

Ich versuche, eine Filterfunktion zu schreiben, die zwei Parameter verwendet: id Typen und der tatsächlichen id-Wert. Mit diesen IDs möchte ich ein Array von Objekten filtern.

Zum Beispiel versuche ich hier ein neues Array zu bekommen, das nur die Werte mit dem Namen 'Mike' enthält.Array.filter von Objekteigenschaft Argument nicht

Objekt:

var sample = [ 
{ name: 'Mike'}, 
{ name: 'John'} 
]; 

Filterfunktion:

function filterById(obj, parameter, id) { 
    return obj.parameter == id; 
} 

this:

console.log(sample.filter(filterById(name, 'Mike'))); 

kehrt Name ist nicht definiert.

Muss ich auch das eigentliche Array übergeben? Können Parameter überhaupt in Filterfunktionen übergeben werden?

Antwort

5

Sie müßten auch die „Parameter“ als String zu übergeben, und die eckige Klammer-Notation zu verwenden, und für diese alle Ihre filterById Funktion arbeiten würde selbst hat eine Funktion zurück, die die Funktion von Array.prototype.filter verwendet Spielen :

var sample = [ 
 
    { name: 'Mike'}, 
 
    { name: 'John'} 
 
]; 
 

 
function filterById(parameter, id) { 
 
    return function(obj){ 
 
    return obj[parameter] == id; 
 
    } 
 
} 
 

 
console.log(sample.filter(filterById('name', 'Mike')));

1

Sie müssen die Funktion selbst nicht aufrufen - es ist ein high-order function ist, so dass Sie nur die Funktion zur Verfügung stellen müssen. Und hier kommen wir zu dem Problem - Sie wollen dort Argumente vorbringen, aber Sie können nicht!

So, es gibt wenige Ansätze. Die erste ist einfach eine andere Funktion zurückzukehren, die Daten in Schließung halten:

function filterById(parameter, id) { 
    return function(item) { 
     return item[parameter] == id; 
    } 
} 

Die zweite Option ist eine andere Funktion über .bind, zu schaffen, die auf die Idee partial application nah ist. Es wird neue Funktionen mit vordefinierten Parametern erstellen. Sie sind immer an erster Stelle, so müssen Sie aktuelle Artikel Definition auf die letzte Position verschieben:

function filterById(parameter, id, item) { 
    return item[parameter] === id; 
} 

// we can create function for the future reference: 
const filterByMike = filterById.bind(null, 'name', 'Mike'); 

sample.filter(filterByMike); 

Es ist schwer zu sagen, was besser ist, aber ich würde persönlich den zweiten Ansatz bevorzugen.

Verwandte Themen