2014-11-16 32 views
4

我想比較2個列表並獲得3個變量:移動項目,偏移量,方向。比較2列表得到移動ID +偏移+方向

實施例1:

舊列表= 121,120,119,43,42,41,40,39,38,37

新列表= 43,121,120,119,42,41,40,39,38,37

我移動項43到列表的前面,

移動項= 43

偏移= 3(之間新舊位置有3項)

方向= 1(因爲它向上移動)


實施例2

舊NIDS = 121,120,119,43,42,41,40,39,38,37

新NIDS = 121,120,119,43,41,40,39,38,37,42

我移動項42向下在列表的末尾,

移動項= 42

偏移量= 5(新舊位置之間有5項)

方向= -1(因爲它向下移動)


我使用JavaScript來處理它。我可以使用哪種算法?或者,我在谷歌搜索有什麼提示?非常感謝你!

+0

我開始與一搜「在JavaScript中比較兩個無序列表」。 –

回答

1

這裏的東西只用你的例子進行了測試。也許它至少可以提供一個可能的方向。 (我可能已經離開了一些邊界/特殊情況。)

var a1 = [121,120,119,43,42,41,40,39,38,37], 
    b1 = [43,121,120,119,42,41,40,39,38,37], 
    a2 = [121,120,119,43,42,41,40,39,38,37], 
    b2 = [121,120,119,43,41,40,39,38,37,42]; 

function f(a,b){ 
    var item, 
     i = offset = 0, 
     direction; 

    while (a[i] == b[i]){ 
    i++; 
    } 

    if (a[i + 1] == b[i]){ 
    direction = -1; 
    item = a[i]; 
    while (b[i] != item){ 
     offset++; 
     i++; 
    } 
    } else { 
    direction = 1; 
    item = b[i]; 
    while (a[i] != item){ 
     offset++; 
     i++; 
    } 
    } 
    return [item,offset,direction] 
} 

輸出:

console.log(f(a1,b1)) 
Array [ 43, 3, 1 ] 

console.log(f(a2,b2)) 
Array [ 42, 5, -1 ] 
+0

它的作品!真的非常感謝你! –

+0

順便說一句,我想通過舊的和新的列表到服務器端進行比較。這是因爲如果客戶端使用瀏覽器太頻繁地更改排序數字將導致瀏覽器崩潰。 –

+0

http://codepen.io/thgreasi/pen/jlkhr和https://github.com/angular-ui/ui-sortable –