首页 > 解决方案 > 基于匹配 Javascript Apps 脚本从二维数组中删除行

问题描述

下面的数组只是我需要它如何工作的示例。我创建了一个 for 循环来将元素附加到匹配的行,现在我正在尝试删除前一行。

示例数组:

[sally, yes, brown, 5],
[david, yes, blue, 8],
[sally, yes, green, 3],
[sally, no, yellow, 7],
[david, no, green, 3],
[ben, no, purple, 12]

所需的输出:

[sally, yes, brown, 5, yes, green, 3, no, yellow, 7],
[david, yes, blue, 8, no, green, 3],
[ben, no, purple, 12]

所以,我想要代码做的是:

  1. 检查元素是否多次出现在第一列中,但与第 3 列中的值不同。
  2. 当上述情况成立时,将该行 (j) 中的第 2 个、第 3 个和第 4 个元素复制到该元素首次出现的行。
  3. 删除该元素出现的其他行。

我当前用于此循环的代码如下。不知道为什么它是错误的,但它没有得到上述结果。

for (i = 0; i <data.length; i++){
  for (j=0; j<data.length; j++){

    var count = 0;
    if(data[i][0] == data[j][0]){

    count++;

    if (data [i][2] != data[j][2]){

      data[i].push(data[j][1], data[j][2], data[j][3], data[j][4])
      
      if (count > 1){

        data.splice(i-1 ,1);

      }
      }
      }
    }
    }
  

我可能会以错误的方式解决这个问题,所以如果你建议有另一种方法来解决它而不是这个 for 循环,那将非常有帮助。比较两个单独的数组而不是将数组与自身进行比较会更好/更容易吗?

此外,在解决这部分代码之后,我需要将空元素添加到所有短于最长的行中。在上面的示例虚拟数据的情况下,最长的是 10 列,所以我需要在任何比这短的行中添加不同数量的空格。原因是我之后将其粘贴到电子表格中,但不能使用 .setValues 方法执行此操作,除非每一行的长度都相同。如果有人也可以提供帮助,那也将不胜感激。

标签: javascriptarraysgoogle-apps-script

解决方案


我相信你的目标如下。

  • 您要实现以下转换。

    •   [
          ["sally", "yes", "brown", 5],
          ["david", "yes", "blue", 8],
          ["sally", "yes", "green", 3],
          ["sally", "no", "yellow", 7],
          ["david", "no", "green", 3],
          ["ben", "no", "purple", 12]
        ]
      
    •   [
          ["sally","yes","brown",5,"yes","green",3,"no","yellow",7],
          ["david","yes","blue",8,"no","green",3],
          ["ben","no","purple",12]
        ]
      
    • 并且,您希望检索以下值作为最终值,以便使用setValues.

        [
          ["sally","yes","brown",5,"yes","green",3,"no","yellow",7],
          ["david","yes","blue",8,"no","green",3,"","",""],
          ["ben","no","purple",12,"","","","","",""]
        ]
      

示例脚本:

在此示例脚本中,为了获取问题中的第一个结果数组,使用了 Map 对象。并且,使用获得的数组,serValues创建用于放入电子表格的最终值。

const data = [
  ["sally", "yes", "brown", 5],
  ["david", "yes", "blue", 8],
  ["sally", "yes", "green", 3],
  ["sally", "no", "yellow", 7],
  ["david", "no", "green", 3],
  ["ben", "no", "purple", 12]
];
const ar = [...data.reduce((m, [a, ...b]) => m.set(a, m.has(a) ? m.get(a).concat(b) : b), new Map())].map(([a, b]) => [a, ...b]);
console.log(JSON.stringify(ar));

const maxLength = Math.max(...ar.map(e => e.length));
const res = ar.map(e => e.length < maxLength ? e.concat(Array(maxLength - e.length).fill("")) : e);
console.log(JSON.stringify(res));

  • 在此示例脚本中,
    • ar是您在问题中想要的数组。
    • res是您要与 一起使用的最终值setValues

参考:


推荐阅读