[英]lodash: filter array of objects with a different array of objects
這個問題特定於lodash 。
給定兩個對象數組,用另一個數組的對象過濾一個數組的最佳方法是什么? 我試圖在下面提出一個方案,而我執行此操作的方法是使用兩個.forEach
循環,但是我想知道是否使用lodash可以進行這種類型的過濾。
users
。
var others = [
{ 'user': 'fred', 'age': 60 },
{ 'user': 'fred', 'age': 70},
{ 'user': 'fred', 'age': 22}
];
將過濾users
數組的對象數組稱為others
。
[
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false }
];
基於others
篩選users
的預期結果是:
var result = [];
_.forEach(users, function (n, key) {
_.forEach(others, function (n2, key2) {
if (n.user === n2.user && n.age === n2.age) {
result.push(n);
}
});
});
console.log(result);
這是獲得所需結果的一種方法。
var result = []; _.forEach(users, function (n, key) { _.forEach(others, function (n2, key2) { if (n.user === n2.user && n.age === n2.age) { result.push(n); } }); }); console.log(result);
這是jsbin上的示例。
http://jsbin.com/hapariviya/1/edit?html,js,控制台,輸出
這是我可以想到的更簡潔的方法:
var result = _.flatten(_.map(others, function(item){
return _.filter(users, item);
}));
編輯:道歉JS Bin輸出混淆了嵌套數組。
您可以索引其他索引,然后獲得所需的結果而不必嵌套循環。 無論數據量如何,它都應該是一個相對有效的解決方案:
// index others by "user + age"
var lookup = _.keyBy(others, function(o) { return o.user + o.age.toString() });
// find all users where "user + age" exists in index, one loop, quick lookup. no nested loops
var result = _.filter(users, function(u) {
return lookup[u.user + u.age.toString()] !== undefined;
});
這給出了相同的結果:
[
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false }
];
有趣的是,您的原始解決方案是所有這些答案中性能最高的。
在這里,性能問題可以忽略不計。 在大多數情況下,DOM交互是前端的主要性能瓶頸。 如果要對龐大的數據集運行此操作並注意到鎖定,您肯定希望通過使用for循環而不是用lodash函數進行迭代來對其進行進一步優化。...但是您通常不會在其中遇到這種數據JavaScript ... SQL和其他人會更好地處理它。
使用ES6粗箭頭和lodash拒絕:
const result = _.reject(users, (item) => _.find(others, { user: item.user }));
var result = _.flatten(_.map(others, function(other){return _.where(users, other);}));
如果您使用lodash和ES6語法。
const users = [
{ 'user': 'barney', 'age': 36, 'active': true },
{ 'user': 'joe', 'age': 40, 'active': false },
{ 'user': 'fred', 'age': 50, 'active': false },
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false },
{ 'user': 'fred', 'age': 25, 'active': false },
{ 'user': 'barney', 'age': 40, 'active': false },
{ 'user': 'pebbles', 'age': 1, 'active': true }
];
const filters = [
{ 'user': 'fred', 'age': 60, 'active': false },
{ 'user': 'fred', 'age': 70, 'active': false },
{ 'user': 'fred', 'age': 22, 'active': false }
];
_.filter(users, ({user, age, active}) => {
return _.findIndex(filters, ({user:filterUser, age:filterAge, active:filterActive}) => { return (user == filterUser && age == filterAge && active == filterActive) }) >= 0;
})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.