【问题标题】:Element-Wise Filtering of Jagged Multidimensional Array with 1D array in JavascriptJavascript中具有一维数组的锯齿状多维数组的元素过滤
【发布时间】:2019-11-20 14:29:29
【问题描述】:
const Amaths = [
[1, 2, 3, 5, 6, 7, 8],
[4, 5, 6, 8],
[12, 3, 4]
]
const checks = [2.5, 4.01, 5];
const picks = [];
for (let j = 0; j < Amaths.length; j++) {
for (let k = 0; k < Amaths[j].length; k++) {
if (Amaths[j][k] > checks[j]) {
picks.push(Amaths[j][k]);
}
}
}
console.log("picks", picks)
我想在不展平输出数组的情况下过滤锯齿状多维数组元素;在本例中,“挑选”。
我曾尝试使用 for 循环,但输出“picks”已变平。另外,我使用过 mathjs 库函数,但是这个库中的元素算术运算似乎只适用于非锯齿状多维数组。
预期的结果应该是:
const picks = [ [3, 5, 6, 7, 8], [5, 6, 8], [12] ]
console.log ("expected picks", picks)
【问题讨论】:
标签:
javascript
for-loop
multidimensional-array
conditional-statements
【解决方案1】:
使用.map 转换为另一个二维数组,在每个子数组上调用.filter,同时与被迭代子数组索引处的checks 进行比较:
const Amaths = [
[1, 2, 3, 5, 6, 7, 8],
[4, 5, 6, 8],
[12, 3, 4]
]
const checks = [2.5, 4.01, 5];
const result = Amaths.map(
(subarr, i) => subarr.filter(
num => num >= checks[i]
)
);
console.log(result);
要修复您的原始代码,您必须在每次外部迭代时将一个新子数组推送到 picks:
const Amaths = [
[1, 2, 3, 5, 6, 7, 8],
[4, 5, 6, 8],
[12, 3, 4]
]
const checks = [2.5, 4.01, 5];
const picks = [];
for (let j = 0; j < Amaths.length; j++) {
picks.push([]);
for (let k = 0; k < Amaths[j].length; k++) {
if (Amaths[j][k] > checks[j]) {
picks[j].push(Amaths[j][k]);
}
}
}
console.log("picks", picks)
(但数组方法在这里可能是更好的选择,它们更简洁易懂)