簡體   English   中英

比較數組對象並顯示差異

[英]Compare array objects and show difference

我有兩個數組要比較,並檢查其中一個數組中是否有已刪除的項目。 如果有區別,請告訴我(已刪除的項目)

這是下面我想如何實現的代碼:

  var completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}]; var invalidList = [{id:3},{id:4},{id:5},{id:6}]; // filter the items from the invalid list, out of the complete list var validList = completedList.map((item) => { console.log(item.id) return item.id; //console.log(invalidList.id); }).filter(item => { Object.keys(invalidList).map(key => { console.log(invalidList[key].id) //return !invalidList[key].id.includes(item.id); }); }) console.log(validList); // Print [1,2,7,8] // get a Set of the distinct, valid items var validItems = new Set(validList); 

但這給了我很多id's我該如何映射兩個數組和對象屬性id的過濾器? 並且僅顯示這些數組對象之間的區別。

所以基本上我希望看​​到的是這些數組之間的差異,因此在本例中記錄id的差異: 1,2,5,6,7,8

您可以選擇Set以獲得不同。 為了獲得彼此的差異(對稱差異),您需要同時獲得兩個差異。

 const difference = (a, b) => Array.from(b.reduce((s, v) => (s.delete(v), s), new Set(a))), getId = ({ id }) => id; var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }], invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }], complete = completedList.map(getId), invalid = invalidList.map(getId), left = difference(complete, invalid), right = difference(invalid, complete), result = [...left, ...right] console.log(result.join(' ')); console.log(left.join(' ')); console.log(right.join(' ')); 

這應該可以解決問題。

let completedList = [{id:1},{id:2},{id:3},{id:4},{id:7},{id:8}];
let invalidList = [{id:3},{id:4},{id:5},{id:6}];
// filter the items from the invalid list, out of the complete list
let temp1 = completedList.map(e => e.id);
let temp2 = invalidList.map(e => e.id);
let validList = temp1.filter(e => temp2.indexOf(e) === -1);
// find items only in invalidList
let difference = temp2.filter(e => temp1.indexOf(e) === -1);
console.log(validList); // Print [1,2,7,8]
console.log(difference);

我經常依靠lodash實現進行比較。 在dash中,您可以按照以下方式完成工作

_.intersectionWith(arr1,arr2,_.isEqual)-相似性_.differenceWith(arr1,arr2,_.isEqual)-差異

這僅限於使用util庫來完成工作。 如果您正在尋找確切的算法,我肯定會花一些時間來開發它,並以評論的形式回復。

謝謝

var completedList = [{ id: 1 }, { id: 2 }, { id: 3 }, { id: 4 }, { id: 7 }, { id: 8 }];
var invalidList = [{ id: 3 }, { id: 4 }, { id: 5 }, { id: 6 }];

//get the items that are in the invalid list but not completed list
var filteredList1 = invalidList.filter((invalidListItem) => !completedList.find((item) => item.id === invalidListItem.id));

//get the items that are in  the completed list but not in the invalid list
var filteredList2 = completedList.filter((completedListItem) => !invalidList.find((item) => item.id === completedListItem.id));

//join the two arrays
var difference = filteredList1.concat(filteredList2);

//display the merged array and sort
console.log(difference.sort((item1, item2) => { return item1.id > item2.id ? 1 : item1.id < item2.id ? -1 : 0; }));

//outputs 1,2,5,6,7,8

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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