编辑后可以更清楚地了解我的问题:
我有一个像这样的多维数组
var data = [
[2017, 1, 0, 0, 0, 0],
[2017, 0, 0, 23, 0, 0],
[2017, 0, 0, 0, 0, 9],
[2017, 0, 12, 0, 0, 0],
[2017, 0, 0, 0, 18, 0]
];
我正在尝试将数据整理成如下所示:
var data = [2017, 1, 12, 23, 18, 9];
其中:
第0列中的年份在所有行中都相同。
对于每一行,第1列至第5列将只有一个非零元素。
是否有一种简便的方法,而不必通过多个for循环处理数据?我希望也许有一些本机方法可以在Array类型或函数库中找到。
答案 0 :(得分:1)
遍历数组,并检查数字是否大于当前数字:
var data = [
[2017, 1, 0, 0, 0, 0],
[2017, 0, 0, 23, 0, 0],
[2017, 0, 0, 0, 0, 9],
[2017, 0, 12, 0, 0, 0],
[2017, 0, 0, 0, 18, 0]
];
let newdata = [];
for (row of data) {
for (let i = 0; i<row.length; ++i) {
newdata[i] = (!newdata[i] || row[i] > newdata[i]) ? row[i] : newdata[i];
}
}
console.log(newdata);
输出:
[2017, 1, 12, 23, 18, 9]
答案 1 :(得分:1)
在第一行使用Array.map()
获取列索引,并将所有行reduce设为该列上的单个非0值:
const data = [
[2017, 1, 0, 0, 0, 0],
[2017, 0, 0, 23, 0, 0],
[2017, 0, 0, 0, 0, 9],
[2017, 0, 12, 0, 0, 0],
[2017, 0, 0, 0, 18, 0]
];
const result = data[0]
.map((_, i) =>
data.reduce((r, e) => r ? r : e[i], 0)
);
console.log(result);
答案 2 :(得分:0)
实际上,基于以下两个条件:
您可以在inners数组上使用reduce()
和findIndex()
查找索引大于零的大于零的第一个数字,然后将其放在累加结果的相关索引上。这将提高性能,因为您不需要在reduce方法的所有迭代中迭代整个内部数组。
var data = [
[2017, 1, 0, 0, 0, 0],
[2017, 0, 0, 23, 0, 0],
[2017, 0, 0, 0, 0, 9],
[2017, 0, 12, 0, 0, 0],
[2017, 0, 0, 0, 18, 0]
];
let res = data.slice(1).reduce((acc, curr) =>
{
let found = curr.findIndex((n, idx) => n > 0 && idx > 0);
acc[found] = curr[found];
return acc;
}, data[0]);
console.log(JSON.stringify(res));