如何使用最有效的方法(通过下划线或纯JS)查找在其数组属性中具有特定值的项的集合?
例如:
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'
]
}发布于 2014-02-10 17:45:38
您可以使用下划线的 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;
});发布于 2014-02-10 17:43:02
可以使用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]);
}
}发布于 2014-02-10 17:47:59
以下是一个可能的(已存在的)解决方案:
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] }]https://stackoverflow.com/questions/21684198
复制相似问题