我有一个数组对象:
[
{ id:1, name: 'Pedro'},
{ id:2, name: 'Miko'},
{ id:3, name: 'Bear'},
{ id:4, name: 'Teddy'},
{ id:5, name: 'Mouse'}
]
我有一个ids为1,3,5的数组,
如何过滤数组对象,使其只保留第二个记录中的id?
发布于 2015-09-03 05:19:45
如果支持Array.includes()
,则可以将其与Array.filter()
一起使用以获取以下项:
const array = [
{ id: 1, name: 'Pedro'},
{ id: 2, name: 'Miko'},
{ id: 3, name: 'Bear'},
{ id: 4, name: 'Teddy'},
{ id: 5, name: 'Mouse'}
];
const filterArray = [1,3,5];
const result = array.filter(({ id }) => filterArray.includes(id));
console.log(result);
如果不支持包含,则可以使用Array.indexOf()
:
var array = [
{ id: 1, name: 'Pedro'},
{ id: 2, name: 'Miko'},
{ id: 3, name: 'Bear'},
{ id: 4, name: 'Teddy'},
{ id: 5, name: 'Mouse'}
];
var filterArray = [1,3,5];
var result = array.filter(function(item) {
return filterArray.indexOf(item.id) !== -1;
});
console.log(result);
发布于 2015-09-03 05:24:10
也许把Array.prototype.reduce
和Array.prototype.some
结合起来。这将保持给定数组need
的顺序。
var data = [
{ id: 3, name: 'Bear' },
{ id: 4, name: 'Teddy' },
{ id: 5, name: 'Mouse' },
{ id: 1, name: 'Pedro' },
{ id: 2, name: 'Miko' },
],
need = [1, 3, 5],
filtered = need.reduce(function (r, a) {
data.some(function (el) {
return a === el.id && r.push(el);
});
return r;
}, []);
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');
要保持data
的顺序,可以使用Array.prototype.filter
var data = [
{ id: 3, name: 'Bear' },
{ id: 4, name: 'Teddy' },
{ id: 5, name: 'Mouse' },
{ id: 1, name: 'Pedro' },
{ id: 2, name: 'Miko' },
],
need = [1, 3, 5],
filtered = data.filter(function (a) {
return ~need.indexOf(a.id);
});
document.write('<pre>' + JSON.stringify(filtered, 0, 4) + '</pre>');
发布于 2015-09-03 05:49:38
如果数据集很小,您可以使用任何提供的解决方案(使用indexOf的解决方案)。
然而,这些解都是O(n^2)的解,因此,在数据集足够大的情况下,滞后会变得明显。在这种情况下,您应该在选择元素之前构建一个索引。
示例:
function filterFast(data, ids) {
var index = ids.reduce(function(a,b) {a[b] = 1; return a;}, {});
return data.filter(function(item) {
return index[item.id] === 1;
});
}
一些基准测试可以测试这里。
https://stackoverflow.com/questions/32376651
复制相似问题