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)
谢谢...
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)
只需使用 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)