簡體   English   中英

lodash:使用不同的對象數組過濾對象數組

[英]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 }
];

有趣的是,您的原始解決方案是所有這些答案中性能最高的。

http://jsperf.com/testingdiwq

在這里,性能問題可以忽略不計。 在大多數情況下,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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM