【问题标题】:How to compare adjacent elements in 2D array if duplicate?如果重复,如何比较二维数组中的相邻元素?
【发布时间】:2021-11-12 04:31:02
【问题描述】:

我有一个二维数组:

var arr1 = [["Egypt","Grid",50],["Egypt","Grid",10],["Nigeria","Grid",20],["Ghana","Grid",60],["Egypt","Grid",30]]

我想检查每个数组的第一个元素,例如埃及、尼日利亚和加纳,看看它们是否重复。但我只希望它检查下一个元素,而不是检查数组中的所有元素。如果一个或多个元素相邻重复,我想返回一个数组,将位置 2 (50,10,20,60,30) 的元素相加

这应该会导致:

var arr2 = [["Egypt","Grid",60],["Nigeria","Grid",20],["Ghana","Grid",60]],["Egypt","Grid",30]]

请注意,即使有 3 个带有“Egypt”的数组,它也只会组合它们彼此相邻的位置。

我已经尝试了mapfor loop,但没有任何可以工作的东西。这是我开始的:

arr1.map(function (unit, index, array) {
var length = array.length
if (index < length - 2) {
  var next = array[index + 1][0]
  if (unit[0] === next) {
    }
  }
})

这可以检查元素是否重复。我想我接下来需要将重复项放入一个单独的数组中,然后我可以 reduce 但不知道该怎么做。任何能帮助我指出正确方向的帮助都会很棒。谢谢!

【问题讨论】:

    标签: javascript arrays dictionary


    【解决方案1】:

    您可以使用简单的for 循环遍历除最后一个数组之外的每个数组,并检查当前迭代元素的第一个元素是否与 current+1 的第一个元素匹配。

    如果它们匹配,则将每个元素的第三个元素相加并分配给当前的迭代数组,删除current+1(此处使用splice())并减少i 以再次重新检查相同的索引。

    var arr1 = [
      ['Egypt', 'Grid', 50],
      ['Egypt', 'Grid', 10],
      ['Nigeria', 'Grid', 20],
      ['Ghana', 'Grid', 60],
      ['Egypt', 'Grid', 30],
    ];
    
    for (let i = 0; i < arr1.length - 1; i++) {
      if (arr1[i][0] === arr1[i + 1][0]) {
        arr1[i][2] = arr1[i][2] + arr1[i + 1][2];
        arr1.splice(i + 1, 1);
        i--;
      }
    }
    
    console.log(arr1);

    【讨论】:

    • 这个答案为我的问题提供了最简单、最灵活的解决方案。谢谢。
    【解决方案2】:

    您可以创建一个grouping 数组,并且仅当最后一个元素countrycategorygrouping 数组中的最后一个元素不匹配或存在是grouping中没有元素

    你可以使用for..of循环

    var arr1 = [
      ["Egypt", "Grid", 50],
      ["Egypt", "Grid", 10],
      ["Nigeria", "Grid", 20],
      ["Ghana", "Grid", 60],
      ["Egypt", "Grid", 30],
    ];
    
    const grouping = [];
    
    for (let [country, category, num] of arr1) {
      const last = grouping[grouping.length - 1];
      const [lastCountry, lastCategory, lastNum] = last ?? [];
    
      lastCountry && lastCountry === country && lastCategory === category
        ? (last[2] += num)
        : grouping.push([country, category, num]);
    }
    
    console.log(grouping);
    /* This is not a part of answer. It is just to give the output fill height. So IGNORE IT */
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案3】:

      这是reduce 的解决方案。为了简化解构,我选择首先将结果 prepend 到累加器,然后最后用 reverse 反转该结果:

      let arr = [["Egypt","Grid",60],["Nigeria","Grid",20],["Ghana","Grid",60],["Egypt","Grid",30]];
      
      let result = arr.slice(1).reduce(([[x, y, z], ...acc], [a, b, c]) =>
          a === x && b == y ? [[a, b, z + c], ...acc]
                            : [[a, b, c], [x, y, z], ...acc]
      , [arr[0]]).reverse();
      
      console.log(result);

      【讨论】:

      • 你可以 reduceRight()arr.pop() 播种避免切片和反向
      • arr.pop() 会改变原始数组,这将是一个小问题。但除此之外,这是个好主意。
      • 是的,我想.slice(0, -1).reduceRight( ... [arr.[arr.length-1]]); 那么。
      • 是的,那就这样吧。
      【解决方案4】:

      var arr1 = [
                  ["Egypt","Grid",50],
                  ["Egypt","Grid",10],
                  ["Egypt","Grid",10],
                  ["Nigeria","Grid",20],
                  ["Nigeria","Grid",20],
                  ["Nigeria","Grid",20],
                  ["Nigeria","Grid",20],
                  ["Nigeria","Grid",20],
                  ["Ghana","Grid",60],
                  ["Egypt","Grid",30]
                 ];
      
      var i=0;
      var j=1;
      while (j<arr1.length){
        if (arr1[i][0] === arr1[j][0]){
          arr1[i][2] += arr1[j][2];
          arr1.splice(j,1);
          continue
        }
        i++;
        j++;
      }
      
      console.log(arr1)

      【讨论】:

        猜你喜欢
        • 2021-10-28
        • 1970-01-01
        • 2020-04-25
        • 2011-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-11
        • 1970-01-01
        相关资源
        最近更新 更多