如何以最有效的方式(通过Underscore或纯JS)查找在其中一个数组属性中具有特定值的项集合?
E.g:
var collection = [
{
name: 'item 1',
tags: [
'tag-1',
'tag-2',
'tag-3'
]
},
{
name: 'item 2',
tags: [
'tag-2',
'tag-4',
'tag-5'
]
},
{
name: 'item 3',
tags: [
'tag-1',
'tag-3',
'tag-4'
]
}
];
我想获取tags-3
属性中tags
的所有项目。
所以我希望得到:
{
name: 'item 1',
tags: [
'tag-1',
'tag-2',
'tag-3'
]
},
{
name: 'item 3',
tags: [
'tag-1',
'tag-3',
'tag-4'
]
}
答案 0 :(得分:2)
您可以使用Underscore的filter
function:
var results = _.filter(collection, function(item) {
return item.tags.indexOf("tag-3") !== -1;
});
还有ES5的Array#filter
(旧浏览器需要垫片):
var results = collection.filter(function(item) {
return item.tags.indexOf("tag-3") !== -1;
});
答案 1 :(得分:1)
您可以使用Array#filter
功能过滤集合:
var collection = [{
name: 'item 1',
tags: [
'tag-1',
'tag-2',
'tag-3'
]
}, {
name: 'item 2',
tags: [
'tag-2',
'tag-4',
'tag-5'
]
}, {
name: 'item 3',
tags: [
'tag-1',
'tag-3',
'tag-4'
]
}]
var results = collection.filter(function (item) {
return item.tags.indexOf('tag-3') !== -1;
});
但是,由于所有浏览器尚不支持此方法,因此您可以尝试以下代码:
var results = [];
for (var i = 0; i < collection.length; i++) {
if (collection[i].tags.indexOf('tag-3') !== -1) {
results.push(collection[i]);
}
}
答案 2 :(得分:0)
这是一个可能的(已经)解决方案:
function findAll(array, fn) {
var i = -1, result = [];
while (++i < array.length) {
if (fn(array[i]) === true) {
result.push(array[i]);
}
}
return result;
}
function has(value, array) {
var i = -1;
while (++i < array.length) {
if (array[i] === value) {
return true;
}
}
return false;
}
用法示例:
var a = [
{ a: [1, 2, 3] },
{ a: [3, 4, 5] },
{ a: [5, 6, 7] }
];
var result = findAll(a, function (item) {
return has(5, item.a);
});
result; // [{ a: [3, 4, 5] }, { a: [5, 6, 7] }]