2016-07-06 62 views
0

我已經搜索高低,不僅在StackOverflow上,而且在網絡上其他許多地方。我嘗試過所有東西,但從根本上說,我的邏輯有些缺陷。我對引入另一個「數組重複」問題表示歉意,但我被卡住了,似乎沒有按預期工作。在多維Javascript數組中返回重複項

無論如何,我有一個多維JavaScript數組,只有2級深。

var array = [[Part #, Description, Qty:], 
      [Part #, Description, Qty:], 
      [Part #, Description, Qty:]]; //etc 

我需要做的就是創建一個搜索array並返回任何重複的「零件編號」線的功能。當它們返回時,我想要返回整個內部數組,並完成描述和數量。

這樣做的訣竅是,符合'重複'的部分#將以不同的方式結束(特別是最後4個字符),所以使用String.prototype.substr對我來說是有意義的。

我知道數組中有重複的數據,所以我知道如果我有解決方案,它會返回這些Part#的。

這是我到目前爲止這讓我最接近的解決方案嘗試:

function findDuplicateResults(arr) { 
var result = []; 
for (var i = 0; i < arr.length; i++) { 
    if (arr[i][0].substr(0,5) === arr[++i][0].substr(0,5)) { 
     result.push(arr[i]);  
    } 
} 
return console.log(result); 

}

我的想法是,如果陣列(SUBSTR中的元素(0,5 )等於下一個在線,將它推到結果數組,我需要另一個在那裏重複,代碼的要點是隻顯示substr(0,5)的僞造。 嘗試使用高階函數這樣一個爲每個,減少和過濾(過濾器是讓我不知道爲什麼它不會做我想做的事的過濾器),但是我只能以這種方式返回[]或整個數組。我用於表示高階函數的邏輯保持不變(這可能是這裏的問題)。

我在期待我的if條件是最大的問題。任何指針或解決方案,不勝感激。

回答

0

您的代碼存在錯誤。當您使用++i時,您將更改i的值,因此它將在下一次迭代中跳過一個項目。

關於邏輯,你只比較一個項目到下一個項目,當你真的應該每個項目比較所有項目:

function findDuplicateResults(arr) { 
    var result = []; 
    for (var i = 0; i <= arr.length - 1; i++) { 
    for (var k = 0; k <= arr.length - 1; k++) { 
     if (i !== k && arr[i][0].substr(0,5) === arr[k][0].substr(0,5)) { 
     result.push(arr[i]); 
     } 
    } 
    } 
    return result; 
} 

雖然,在「SUBSTR」可能被丟棄,而' for'循環可以被更高階的函數替代:

function findDuplicateResults(arr) { 
    return arr.filter(function(item1){ 
    return arr.filter(function(item2){ 
     return item1[0] === item2[0]; 
    }).length > 1; 
    }); 
} 
+0

非常感謝,它的工作!快速跟進,爲什麼arr.length - 1?其餘的很有意義,但我陷入了這一點。再次感謝! –

+0

因爲數組有零基索引。想象一下,你有一個項目的數組。 array.length是1對不對?現在想象你想訪問數組中的項目。數組[1]將不起作用,因爲它不存在。你的項目在數組[0]或數組[array.length - 1] –

+0

,這讓我意識到我應該使用'<='而不是'<。查看更新的答案 –