使用 Underscore.js 使用 'contains' 过滤 属性 上的对象数组
Using Underscore.js to filter an array of objects on a property using a 'contains'
我有一个对象数组,我想使用下划线在 属性 上使用 contains/any 方法进行过滤。
例如,如果我有以下变量:
var people = [
{
name: 'Dave',
age: 26
},
{
name: 'Frank',
age: 23
}];
var allowedAges = [20, 23, 24];
我想使用下划线来得到如下结果:
var allowedPeople = [];
_.each(_.where(people, { age: _.any()}), function (person) {
allowedPeople.push(person);
});
并且也有可能 allowedAges 是一个对象数组并且 id 想要在 people[=25] 上使用 contains/any =] 使用 allowedAges.
中对象的 属性 数组
在极少数情况下,contains
的 JS 等价物通常是 indexOf
(and find
。
您可以使用 the built-in Array.prototype.filter
这样做:
people.filter(function (person) {
return allowedAges.indexOf(person.age) !== -1; // -1 means not present
});
或带下划线,使用相同的谓词:
_.filter(people, function (person) {
return allowedAges.indexOf(person.age) !== -1; // -1 means not present
}
如果您可以访问 ES6 集合或 Set
, you can replace the allowedAges
array with a set (enforcing unique values) and simply use Set.prototype.has
的 polyfill:
people.filter(person => allowedAges.has(person.age))
为什么不使用 vanilla 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;
});
这是一个纯JS版本:
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>")
为了完整起见,这里有一个下划线解决方案,它适用于包含 age
属性.
的整数和对象的混合数组
var allowedPeople = _.filter(people, (p) =>
_.some(allowedAges, (a) => (a.age || a) === p.age)
);
我有一个对象数组,我想使用下划线在 属性 上使用 contains/any 方法进行过滤。
例如,如果我有以下变量:
var people = [
{
name: 'Dave',
age: 26
},
{
name: 'Frank',
age: 23
}];
var allowedAges = [20, 23, 24];
我想使用下划线来得到如下结果:
var allowedPeople = [];
_.each(_.where(people, { age: _.any()}), function (person) {
allowedPeople.push(person);
});
并且也有可能 allowedAges 是一个对象数组并且 id 想要在 people[=25] 上使用 contains/any =] 使用 allowedAges.
中对象的 属性 数组在极少数情况下,contains
的 JS 等价物通常是 indexOf
(and find
。
您可以使用 the built-in Array.prototype.filter
这样做:
people.filter(function (person) {
return allowedAges.indexOf(person.age) !== -1; // -1 means not present
});
或带下划线,使用相同的谓词:
_.filter(people, function (person) {
return allowedAges.indexOf(person.age) !== -1; // -1 means not present
}
如果您可以访问 ES6 集合或 Set
, you can replace the allowedAges
array with a set (enforcing unique values) and simply use Set.prototype.has
的 polyfill:
people.filter(person => allowedAges.has(person.age))
为什么不使用 vanilla 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;
});
这是一个纯JS版本:
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>")
为了完整起见,这里有一个下划线解决方案,它适用于包含 age
属性.
var allowedPeople = _.filter(people, (p) =>
_.some(allowedAges, (a) => (a.age || a) === p.age)
);