2016-03-30 2 views
2

Ich habe ein Array von Objekten, die ich filtern würde mit einer contains/any-Methode für eine Eigenschaft mit Unterstrich.Verwenden von Underscore.js zum Filtern eines Array von Objekten auf einer Eigenschaft mit einem "enthält"

Zum Beispiel, wenn ich die folgenden Variablen hat:

var people = [ 
{ 
    name: 'Dave', 
    age: 26 
}, 
{ 
    name: 'Frank', 
    age: 23 
}]; 
var allowedAges = [20, 23, 24]; 

würde Ich mag Strich verwenden, mit dem Ergebnis am Ende wie:

var allowedPeople = []; 
_.each(_.where(people, { age: _.any()}), function (person) { 
      allowedPeople.push(person); 
     }); 

Und es auch Fälle geben kann, wo allowedAges ist ein Array von Objekten und die ID möchte das contains/any auf dem People Array verwenden, das eine Eigenschaft der Objekte in allowedAges verwendet.

Antwort

7

Das JS-Äquivalent von contains ist normalerweise indexOf (und find in seltenen Fällen).

Sie können the built-in Array.prototype.filter verwenden, um dies zu tun, wie:

people.filter(function (person) { 
    return allowedAges.indexOf(person.age) !== -1; // -1 means not present 
}); 

oder mit Unterstrich, das gleiche Prädikat mit:

_.filter(people, function (person) { 
    return allowedAges.indexOf(person.age) !== -1; // -1 means not present 
} 

Wenn Sie Zugriff auf ES6 Sammlungen oder eine polyfill für Set haben, können Sie kann das allowedAges Array durch ein Set ersetzen (durchsetzen eindeutiger Werte) und einfach Set.prototype.has:

people.filter(person => allowedAges.has(person.age)) 
verwenden
+1

Das OP bat um eine Unterstrichlösung, keine einfache js-Lösung. Ich kann das nicht ablehnen, weil Sie die Frage wie gewünscht beantwortet haben, und die pure js Lösung kann als zusätzliche Information angesehen werden, aber warum ist das reine js Zeug überhaupt notwendig, da das OP eine Frage zu Unterstreichung explizit gestellt hat? Und warum ist der "native" Teil Ihrer Antwort zuerst? –

+2

@EngineerDollery "Ich möchte Unterstreichung verwenden" Bedeutet nicht, dass er Unterstreichung verwenden muss, nein, wo haben sie gesagt "Dies muss mit Unterstreichung durchgeführt werden" – George

+0

@EngineerDollery Um die eingebauten Methoden zu fördern. Eine Menge Leute vergessen sie, aber in den meisten Browsern wird die Unterstreichung einfach auf sie verschoben (der Unterstrich ist größtenteils ein Polyfill von vor den funktionierenden Methoden der Arrays). Da das OP nach Unterstreichung gefragt hat, ist die äquivalente Lösung nur für den Fall vorhanden. – ssube

0

Warum nicht verwenden vanille js filter?

var people = [ 
    { 
    name: 'Dave', 
    age: 26 
    }, 
    { 
    name: 'Frank', 
    age: 23 
    } 
]; 

var allowedAges = [20, 23, 24]; 

var allowedPeople = people.filter(function((person, i, arr) { 
    return allowedAges.indexOf(person.age) !== -1; 
}); 
+1

Das OP bat um eine Unterstrichlösung, keine einfache js-Lösung. –

+1

@EngineerDollery es ist sehr möglich OP wusste nicht, dass es eine Nicht-Unterstrich-Lösung gab. –

0

Dies ist eine reine JS Version:

var people = [{ 
 
    name: 'Dave', 
 
    age: 26 
 
}, { 
 
    name: 'Frank', 
 
    age: 23 
 
}]; 
 
var allowedAges = [20, 23, 24]; 
 

 
function filterData(arr, key, searchList){ 
 
    var result = []; 
 
    if(Array.isArray(searchList)){ 
 
    result = arr.filter(function(item){ 
 
     return (searchList.indexOf(item[key])>-1); 
 
    }); 
 
    } 
 
    else{ 
 
    result = arr.filter(function(item){ 
 
     return (searchList === item[key]); 
 
    }); 
 
    } 
 
    return result; 
 
} 
 

 
document.write("<pre>" + JSON.stringify(filterData(people,"age", allowedAges), 0, 4) + "</pre>")

+1

Das OP bat um eine Unterstrichlösung, keine einfache js-Lösung. –

1

Aus Gründen der Vollständigkeit, hier ist eine Unterstrich-Lösung, die ein age enthalten, mit einem gemischten Array von ganzen Zahlen und Objekten arbeitet Eigentum.

var allowedPeople = _.filter(people, (p) => 
    _.some(allowedAges, (a) => (a.age || a) === p.age) 
);