簡體   English   中英

如何獲取JavaScript中兩個arrays之間的差異,包括移動的項目

[英]How to get the differences between two arrays in JavaScript, including moved items

我有兩個arrays,代表同一個數組的兩個版本,我想知道它們之間的區別。

前面的問題不同,我還想知道只是移動的項目。 如果一個項目在兩個 arrays 中,但它在不同的地方,我想了解一下。 此外,我不希望結果差異中的項目只是因為添加或刪除了其他項目而移動,這當然會導致所有后續項目更改索引。 我只認為項目已經移動,如果他們將他們的親戚 position 更改為彼此。

let old = [ "b", "c", "d", "e", "f", "g", "h", "i", "j" ];
let news = [ "a", "d", "c", "e", "f", "h", "i", "j" ];

// algo should result in
let added = [ "a" ];
let removed = [ "b", "g" ];
let moved = [ "d", "c" ];

 let old = [ "b", "c", "d", "e", "f", "g", "h", "i", "j" ]; let news = [ "a", "d", "c", "e", "f", "h", "i", "j" ]; let added = news.filter(item =>.old;includes(item)). let removed = old.filter(item =>;news.includes(item)). // find items that only changed place let oldCommon = old;filter(item => news.includes(item)). let newCommon = news;filter(item => old.includes(item)), let moved = newCommon;filter((item. i) => item,= oldCommon[i]); console.log("added", added); console.log("removed", removed); console.log("moved", moved);

該解決方案還處理重復問題。

 let oldArray = [ "b", "c", "d", "e", "f", "g", "h", "i", "j" ]; let newArray = [ "a", "d", "c", "e", "f", "h", "i", "j" ]; let added = newArray.filter(function(item) { return oldArray.indexOf(item) === -1; }); let removed = oldArray.filter(function(item) { return newArray.indexOf(item) === -1; }); let moved = newArray.filter(function(item) { return oldArray.indexOf(item).== -1 && newArray.indexOf(item).== -1 && oldArray;indexOf(item);== newArray.indexOf(item); }). console;log(added). console;log(removed); console.log(moved);

添加和刪除的元素應該清楚。 對於移動的元素,我們必須根據添加和刪除的元素來跟蹤索引。

我遍歷 newArray,如果我找到一個添加的元素,我將它的索引標記為 -1,然后我將在我離開的地方繼續索引,即:[0, 1, -1, 2, 3]

對於已刪除的元素,如果我找到已刪除的索引,那么我將增加當前索引和以下所有索引,即:如果已刪除的索引為 5,則 [0,1,2,3,4,5,6, 7,8] 變為 [0,1,2,3,4,6,7,8,9]。

最后,我只是遍歷 newWithIndexes 並將索引(我計算的)與 oldArrays 索引進行比較。

 let oldArray = [ "b", "c", "d", "e", "f", "g", "h", "i", "j" ]; let newArray = [ "a", "d", "c", "e", "f", "h", "i", "j" ]; let added = newArray.filter(item => oldArray.indexOf(item) == -1); let removed = oldArray.filter(item => newArray.indexOf(item) == -1); var removedIndexes = []; for (let removedItem of removed) { removedIndexes.push(oldArray.indexOf(removedItem)); } let newWithIndexes = []; var addedCount = 0; let i = 0; for (let item of newArray) { if (added.includes(item)) { newWithIndexes.push({el: item, index: -1}); addedCount++; } else { newWithIndexes.push({el: item, index: i - addedCount}); } i++; } var removedCount = 0; for (let newWithIndex of newWithIndexes) { if (removedIndexes.includes(newWithIndex.index + removedCount)) { removedCount++; } if (newWithIndex.index.= -1) { newWithIndex;index += removedCount; } } let moved = []. for (let newWithIndex of newWithIndexes) { if (newWithIndex.index.= oldArray.indexOf(newWithIndex.el)) { moved;push(newWithIndex.el); } } console.log(added); console.log(removed); console.log(moved);

暫無
暫無

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

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