javascript - 基于匹配 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]
所以,我想要代码做的是:
- 检查元素是否多次出现在第一列中,但与第 3 列中的值不同。
- 当上述情况成立时,将该行 (j) 中的第 2 个、第 3 个和第 4 个元素复制到该元素首次出现的行。
- 删除该元素出现的其他行。
我当前用于此循环的代码如下。不知道为什么它是错误的,但它没有得到上述结果。
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 方法执行此操作,除非每一行的长度都相同。如果有人也可以提供帮助,那也将不胜感激。
解决方案
我相信你的目标如下。
您要实现以下转换。
从
[ ["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
。
参考:
推荐阅读
- javascript - 我无法从日期输入值获取日期到另一个 var angularjs
- matlab - SIMULINK:upperBoundSize.isUnknown()
- asp.net - Id 变量得到未定义的 Asp.net ajex
- javascript - 如何在 js 文件中隐藏 API 密钥,我使用“axios”从 js 文件请求 url,我的应用程序不是基于节点的
- php - 我找不到为什么我的代码 puttsute 错误消息
- c# - 使用任务仅调用一次 Web 服务
- php - 如何在 foreach 循环中运行查询?
- php - 无法使用我的 .htaccess 和配置文件
- jquery - 在表单内显示隐藏元素时,第一次未触发模糊事件的单击
- reactjs - 如何在功能组件的 React 中使用 props 中的泛型?