我在這個執行緒上找了一段時間,但我能找到的只是兩個陣列之間的比較結果是添加或洗掉了哪些元素。
我需要的是猜測哪個元素已從索引移動到另一個。
示例:讓我們采用以下陣列:
let array1 = ['A', 'B', 'C', 'D', 'E', 'F'];
'E' 元素將從第 4 個索引移動到第 2 個索引,我們將得到:
let array2 = ['A', 'B', 'E', 'C', 'D', 'F'];
我需要一個函式,它回傳哪個元素已更改,它在新陣列 2 中的新索引和它在陣列 1 中的舊索引;
我過去做過這樣的演算法,大致(從我現在記得的)包括在兩個陣列之間尋找第一個不同的元素,然后檢查它后面的序列以猜測找到的 diff 元素本身是否是移動的元素或取代它的那個。
所以在重寫之前,我希望我能找到一個可以使用的;)
uj5u.com熱心網友回復:
我不確定完整的要求是什么,但這將檢測向前和向后移動以及角色交換。它適用于任何順序,但它對更改內容的預測會隨著連續發生的更改越多而變得越不準確。這是一個使用字典的示例:
const array1 = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K'];
const array2 = ['A', 'B', 'E', 'C', 'D', 'F', 'H', 'I', 'G', 'K' , 'J'];
let globalOffset = 0;
let currentSuspect = "";
var dict = new Object();
array1.forEach((char, index) => {
dict[char] = index;
});
array2.forEach((char, index) => {
dict[char] = dict[char] - index;
});
let offset = 0;
let prevValue = 0;
Object.entries(dict).forEach((entry, index) => {
const [key, value] = entry;
switch(true){
case offset === 0 && value < -1:
console.log(`The character ${key} had its index moved forward by ${Math.abs(value)}! \n New index: ${index Math.abs(value)} - Old index: ${index}`);
break;
case offset < 0 && value > 1:
console.log(`The character ${key} had its index moved backwards by ${value}! \n New index: ${index offset} - Old index: ${index}`);
break;
case prevValue === -1 && offset === -1 && value === 1:
console.log(`The characters ${key} and ${array2[index]} were swapped!`);
break;
}
prevValue = value;
offset = value;
});
uj5u.com熱心網友回復:
let array1 = ['A', 'B', 'C', 'D', 'E', 'F'];
// test 1 : moving 'B' from index 1 to index 3
let array2 = ['A', 'C', 'D', 'B', 'E', 'F'];
// test 2: moving 'E' from 4 to 1
// let array2 = ['A', 'E', 'B', 'C', 'D', 'F'];
// test 3 : moving 'A' from 0 to 5
// let array2 = ['B', 'C', 'D', 'E', 'F', 'A'];
function getMovedElementInfos(array1, array2) {
let firstDiffElIndexInNewArray = array2.findIndex((el, elindx) => el !== array1[elindx]);
let firstDiffElInNewArray = array2[firstDiffElIndexInNewArray];
let nextElInNewArray = array2[firstDiffElIndexInNewArray 1];
let firstDiffElIndexInOldArray = array1.findIndex(el => el === firstDiffElInNewArray);
let nextElInOldArray = array1[firstDiffElIndexInOldArray 1];
let movedEl, movedElFrom, movedElTo;
if (nextElInNewArray === nextElInOldArray) {
movedEl = array1[firstDiffElIndexInNewArray];
movedElFrom = firstDiffElIndexInNewArray;
movedElTo = array2.findIndex(el => el === movedEl);
} else {
movedEl = firstDiffElInNewArray;
movedElFrom = firstDiffElIndexInOldArray;
movedElTo = firstDiffElIndexInNewArray;
}
return {
movedEl,
movedElFrom,
movedElTo
}
}
const {
movedEl,
movedElFrom,
movedElTo
} = getMovedElementInfos(array1, array2)
console.log('movedEl is: ', movedEl);
console.log('movedEl index in old array is: ', movedElFrom);
console.log('movedEl index in new array is: ', movedElTo);
console.log('array1[movedElFrom]: ', array1[movedElFrom]);
console.log('array2[movedElTo]: ', array2[movedElTo]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/477957.html
標籤:javascript 数组
