【问题标题】:Returning duplicates in multidimensional Javascript array返回多维Javascript数组中的重复项
【发布时间】:2016-11-09 04:00:35
【问题描述】:

我搜索过很多次,不仅在 StackOverflow 上,而且在网络上的许多其他地方。我已经尝试了看似一切的东西,但我的逻辑从根本上存在缺陷。对于引入另一个“数组中的重复项”问题,我深表歉意,但我被卡住了,似乎没有任何工作按预期工作。

无论如何,我有一个多维 JavaScript 数组,只有 2 层深。

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

我需要做的是创建一个搜索array 并返回任何重复的“Part #”行的函数。当它们返回时,我希望返回整个内部数组,并附上描述和数量。

这样做的诀窍在于,符合“重复”条件的零件编号会以不同的方式结尾(特别是最后 4 个字符),因此使用 String.prototype.substr 是有意义的(对我而言)。

我知道我正在寻找的数组中有重复项,所以我知道如果我有解决方案,它将返回那些 Part #'s。

这是我迄今为止尝试过的最接近解决方案的方法:

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) 的欺骗。

已经尝试过使用高阶函数,例如 map、forEach、reduce 和 filter(filter 让我难以理解为什么它不符合我的要求),但是我只能以这种方式返回[] 或整个数组。我用于所述高阶函数的逻辑保持不变(这可能是这里的问题)。

我预计我的if 条件是问题最多的地方。非常感谢任何指针或解决方案。

【问题讨论】:

    标签: javascript arrays multidimensional-array duplicates


    【解决方案1】:

    您的代码中有错误。当您使用++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;
      });
    }
    

    【讨论】:

    • 非常感谢,它成功了!快速跟进,为什么 arr.length - 1?其余的很有意义,但我坚持这一点。再次感谢!
    • 因为数组有从零开始的索引。想象一下,您有一个包含一个项目的数组。 array.length 是 1 对吗?现在假设您想要访问数组中的项目。 array[1] 不起作用,因为它不存在。您的项目位于数组 [0] 或数组 [array.length - 1]
    • 这让我意识到我应该使用&lt;= 而不是&lt;。查看更新的答案
    猜你喜欢
    • 2014-07-02
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2021-08-29
    • 2023-04-03
    • 2011-02-18
    • 2014-01-26
    • 2017-08-27
    相关资源
    最近更新 更多