![](/img/trans.png)
[英]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.