[英]Filter array of objects based on multiple values from another array of objects
[英]filter values from an array of strings from another array of objects
我试图只获取那些不存在于对象数组中的字符串
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}];
var strings = ['a','b','z','x'];
let result = strings.filter(o1 => !objects.includes(o2=> o2.name === o1));
console.log(result)
所以结果应该只是'z'和'x'
从你的objects
数组,你可以创建Map ( lookup
),它的键是name
属性,值is
属性的否定版本。
Map {
'a': true,
'b': true,
'c': true
}
然后,您可以使用它来查找过滤字符串数组。 如果 Map 的值为true
则您可以将其从数组中删除(通过返回 false),否则,如果 Map 没有当前字符串,则可以将其保留在数组中。 通过预处理对象数组来创建地图/对象可以使您无需在filter()
内部使用内部循环,如果数组大小增加,则可以提高代码的整体效率。
const objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; const strings = ['a','b','z','x']; const lookup = new Map(objects.map(({name, is}) => [name, !is])); const result = strings.filter(v => !lookup.get(v)); console.log(result);
你的方法非常接近。 但是, .includes()
方法不接受像您提供的回调函数( .includes()
将在您的数组中搜索您提供的相同函数对象引用)
const cb = v => v; // fake callback const arr = [cb]; // some array contains that callback console.log(arr.includes(cb)); // providing the callback as a function to includes // => true, as the `cb` function is inside of `arr`
如果你想提供你自己的“包含”逻辑,你可以使用.some()
代替:
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; var strings = ['a','b','z','x']; let result = strings.filter(o1 => !objects.some(o2 => o2.name === o1)); console.log(result)
如果您好奇,上面的.some()
逻辑的时间复杂度为 O(N*M),而 Map 方法的时间复杂度为 O(N+M),其中 N 是字符串的大小array 和 M 是对象数组的大小。
使用map
来简化数组,然后使用 filter 和 includes 来找出不属于objects
的strings
。
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; var strings = ['a','b','z','x']; let names = objects.map(dataItem => dataItem.name) let filteredNames = strings.filter(stringItem => !names.includes(stringItem)) console.log(filteredNames)
现在包括允许回调函数。
而不是这个使用查找:
var objects = [{name:'a',is:false},{name:'b',is:false},{name:'c',is:false}]; var strings = ['a','b','z','x']; let result = strings.filter(o1 => !objects.find(o2=> o2.name === o1)); console.log(result)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.