2016-07-06 65 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

,这让我意识到我应该使用'<='而不是'<。查看更新的答案 –