如何使用 Lodash _.filter 过滤多条件?

K.K*_*ing 2 javascript filter lodash

我想从集合中过滤两个 obj,从服务器获取的 conditionArr,所以它是不可预测的。

我的代码是:

var users = [{
        user: 'barney',
        age: 36,
        active: true
    },
    {
        user: 'fred',
        age: 40,
        active: false
    },
    {
        user: 'travis',
        age: 37,
        active: true
    }
];

// the Array fetch from Server, so it's unpredictable.
var conditionArr = [{
    user: 'barney'
}, {
    user: 'fred'
}];

// _.filter
result = _.filter(users, conditionArr);
Run Code Online (Sandbox Code Playgroud)

我的预期输出:

 // expect results:
 [{
         user: 'barney',
         age: 36,
         active: true
     },
     {
         user: 'fred',
         age: 40,
         active: false
     }
 ]  
Run Code Online (Sandbox Code Playgroud)

实际结果:

[]
Run Code Online (Sandbox Code Playgroud)

谢谢。


我找到了一个更好的方法:

result =  _.map(conditionArr, (con) => ({
    ...con,
   ...(_.find(users, { user: con.user })),
}))
Run Code Online (Sandbox Code Playgroud)

谢谢...

Ori*_*ori 5

使用_.intersectionBy()

const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];

const conditionArr = [{"user":"barney"},{"user":"fred"}];

const result = _.intersectionBy(users, conditionArr, 'user');

console.log(result);
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.5/lodash.min.js"></script>
Run Code Online (Sandbox Code Playgroud)

Vanilla JS - 我添加了一个intersectionBy()key第二个数组的相关值转换为 Set 的简单方法。然后您可以使用 Set 过滤第一个数组。

const intersectionBy = (arr1, arr2, key) => {
  const keys = new Set(arr2.map(o => o[key]));
  
  return arr1.filter(o => keys.has(o[key]));
};

const users = [{"user":"barney","age":36,"active":true},{"user":"fred","age":40,"active":false},{"user":"travis","age":37,"active":true}];

const conditionArr = [{"user":"barney"},{"user":"fred"}];

const result = intersectionBy(users, conditionArr, 'user');

console.log(result);
Run Code Online (Sandbox Code Playgroud)


Fal*_*aly 2

只需使用 array.filter 即可:

var users = [
 { user: 'barney', age: 36, active: true },
 { user: 'fred',  age: 40, active: false },
 { user: 'travis', age: 37, active: true}
];

var result = users.filter(({user}) => user === 'barney' || user === "fred");
console.log(result);
Run Code Online (Sandbox Code Playgroud)