2014-03-30 81 views
2

我想通過找出哪個元素被移動來找出兩個數組之間的區別。我知道一個元素會被移動,並且該訂單將保留在列表的其餘部分,但我無法弄清楚如何找到它。如何確定哪個元素在數組中移動?

實施例:

答:1 2 3 4 5 6

B:2 3 4 5 1 6

所有元素的存在在這兩個列表中,但如何做我發現元素1從索引0移動到索引4?

我,我花了,但不工作的基本做法是:

//Original array 
var a = [1, 2, 3, 4, 5, 6]; 

//New array 
var b = [2, 3, 4, 5, 1, 6]; 

for(var i=0; i < a.length; i++) { 
    if(a[i] != b[i] && a[i+1] != b[i]) { 
     console.log(b[i] + " moved"); 
    } 
} 

我已經通過代碼固定打印出B [I]而不是[I],但它不是在所有情況下工作如:

答:1,2,3,4

B:1,4,2,3

+0

定義「不工作」。它如何失敗?我看起來很好。 –

+0

@JanDvorak該代碼告訴我,5移動,當答案應該是1. – Flipper

+0

@Smash ...你想說什麼? –

回答

5

的問題是在你的if語句中的第二個條件。在您的示例中,當元素a[0]已移動時,a[0+1] === b[0],因此if子句的計算結果爲false。

嘗試相反,可能不需要

var idx = 0; 
var len = a.length; 
while ((a[idx] === b[idx] || a[idx] === b[idx+1]) && idx < len) { 
    idx++; 
} 
console.log('Element a[' + idx + ']=' + a[idx] + ' moved.'); 
+0

我發現它打破了這樣的事情:http://jsfiddle.net/76kTy/因爲它應該是元素4已經移動。 – Flipper

+0

@Flipper爲什麼不在這裏發佈示例? –

+0

@Flipper考慮'[1,2,3,4]/[1,2,4,3]'。應該打印什麼值?此外,您的代碼也不適用於向後移動的元素。 –

1

你ç一個使用jQuery .inArray()它會返回指數,從0開始返回-1,如果沒有找到:

var a = [1, 2, 3, 4, 5, 6]; 

//New array 
var b = [2, 3, 4, 5, 1, 6]; 

for(i=0; i < a.length; i++) { 
    var j = $.inArray(a[i], b); 

    if(i != j){ 
     console.log(a[i], "moved to index "+j); 
    }else{ 
     console.log(a[i], "not moved"); 
    } 
} 

看到這個的jsfiddle:http://jsfiddle.net/Rdzj4/

+1

這將打印出所有的元素。我不明白inArray如何幫助我,因爲所有元素都存在於這兩個數組中。 – Flipper

+2

對不起,我一開始並沒有很好的理解。是的,你可以使用inArray,因爲它返回的索引可以與'i'比較。看到我更新的答案。謝謝 –

+1

我也是同樣的問題,在這裏的所有答案我看到這非常簡單,很容易理解。謝謝 – 2014-03-30 07:15:17

1

Edited-,但我不想離開一個錯誤的答案。

在這裏,我看看遠處每個產品從原來的指數,

和圖中的一個是最出的順序是mover-

這是假設在[2,1,3, 4,5,6]它是移動兩個,而不是1,

和[1,2,3,4,6,5]它是6,而不是5

function whoMoved(a, b){ 
    var max= 0, min= a.length, dist, 
    order= b.map(function(itm, i){ 
     dist= i-a.indexOf(itm); 
     if(dist<min) min= dist; 
     if(dist>max) max= dist; 
     return dist; 
    }); 
    if(Math.abs(min)>= max) max= min; 
    return b[order.indexOf(max)]; 
} 

//測試

var a= [1, 2, 3, 4, 5, 6]; 

var b= [1, 6, 2, 3, 4, 5];//6 to left 
var c= [1, 3, 4, 2, 5, 6];//2 to to right 
var d= [3, 1, 2, 4, 5, 6];//3 to left 
var e= [2, 3, 4, 5, 1, 6];//1 to right 

[whoMoved(a, b), whoMoved(a, c), whoMoved(a, d),whoMoved(a, e)]; 

/* returned value: (Array) [6,2,3,1] */ 
+0

我發現,它打破了我的第二個例子:http://jsfiddle.net/qKp3h/ – Flipper

+0

當你移動一個元素的權利,而不是左 – GuiDocs

4

基本上,如果我理解正確,元素移動意味着它被刪除並在其他地方插入 。 所以你首先找到的第一個點,那裏有一個插入/缺失:

function whichMoved(a, b) { 
     for(var i=0; i < a.length; i++) { 
     if (a[i] != b[i]) { 

現在,如果這是一個缺失,則該元素已向前移動,這意味着,插在b中較大的指數,和折射率之間的所有元素被移動到左邊, 這意味着下一個元件已經移動一個位置向後:

if(a[i+1] == b[i]) { 
    console.log(a[i] + " moved forward"); 
    break; 
} 

否則,元件向後移動:

else { 
    console.log(b[i] + " moved backward") 
    break; 
} 

整件事:

//Original array 
var a = [1, 2, 3, 4, 5, 6]; 

//testing 
whichMoved(a, [2,3,4,5,1,6]); //prints 1 moved forward 
whichMoved(a, [5,1,2,3,4,6]); //prints 5 moved backward 
function whichMoved(a, b) { 
    for(var i=0; i < a.length; i++) { 
    if (a[i] != b[i]) { 
     if(a[i+1] == b[i]) { 
     console.log(a[i] + " moved forward"); 
     break; 
     } else { 
     console.log(b[i] + " moved backward") 
     break; 
     } 
    } 
    } 
} 
+0

你的回答非常好,所以我已經upvoted它這個工程,但邁克爾的回答非常簡潔而這正是我需要的。謝謝! – Flipper