簡體   English   中英

從另一個對象數組過濾字符串數組中的值

[英]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 來找出不屬於objectsstrings

 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.

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