use*_*934 1 javascript arrays multidimensional-array
我能否获得有关如何使用 JavaScript 从二维数组中提取多列(如下所示)的指导?
Array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12],
];
Run Code Online (Sandbox Code Playgroud)
到目前为止我所看到的使用 forEach 或 map 的简单方法将允许一次提取一列,有没有一种方法可以以某种方式嵌套它以提取所需的任何列索引?
假设期望输出列是 1,2 和 4。
Output = [
[1, 2, 4],
[5, 6, 8],
[9,10,12],
];
Run Code Online (Sandbox Code Playgroud)
编辑:
我需要解决的另一个问题是如何删除 Array[i][1]=0 或空的行。
假设我们有额外的数组元素......
Array = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12],
[13,0,15,16],
[17, ,19,20],
[21,22,23,24],
];
Run Code Online (Sandbox Code Playgroud)
现在所需的输出是...
Output = [
[1, 2, 4],
[5, 6, 8],
[9,10,12],
[21,22,24],
];
Run Code Online (Sandbox Code Playgroud)
您可以将.map()每一行放入arr一个新数组中,您可以通过使用.map()您希望获得的列/索引数组的内部来获得该数组。内部映射会将每个索引映射到行中与其关联的值,从而为您提供每行每列的值。
请参阅下面的示例:
const arr = [
[1, 2, 3, 4],
[5, 6, 7, 8],
[9,10,11,12],
];
const cols = [1, 2, 4];
const res = arr.map(r => cols.map(i => r[i-1]));
console.log(res);Run Code Online (Sandbox Code Playgroud)
更多详细信息:正如您所提到的,第一个映射将内部的每个内部数组公开arr给内部映射函数:
cols.map(i => r[i-1])
Run Code Online (Sandbox Code Playgroud)
该映射函数将循环遍历内部定义的索引cols并将它们转换为新值。例如,假设您r是第二个数组:
[5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)
执行cols.map(...)将循环遍历 中的每个元素(i在回调函数中用 表示)[1, 2, 4]。对于每个元素,我们将其“转换”为一个新元素:
i = 1
r = [5, 6, 7, 8]
new value: r[1-1] = 5
Run Code Online (Sandbox Code Playgroud)
下一次迭代我们查看 中的下一个值cols:
i = 2
r = [5, 6, 7, 8]
new value: r[2-1] = 6
Run Code Online (Sandbox Code Playgroud)
最后,我们看看最终的值cols:
i = 4
r = [5, 6, 7, 8]
new value: r[4-1] = 8
Run Code Online (Sandbox Code Playgroud)
因此,映射函数会生成一个新数组,该数组将 cols 中的值转换[1, 2, 4]为当前行中这些索引处的值[5, 6, 8]。每个内部数组/行都会发生这种情况,从而产生最终结果。
编辑
根据您的编辑,您可以应用上面相同的逻辑来获得仅包含您想要的列的数组。完成此操作后,您可以仅保留第二列中.filter()具有真值的行。将所有具有真值的数组保留在第二列中将从结果数组中删除第二列中具有非真值(假值)的数组。0和undefined都是浮夸的值,所以它们不会被保留。
请参阅下面的示例:
cols.map(i => r[i-1])
Run Code Online (Sandbox Code Playgroud)
如果您想要忽略多个列,则可以使用它.every()来确保每个(即:每个)列都包含真值。如果它们都这样做,则将.every()返回true,保留该列,否则,它将返回false,删除该列:
[5, 6, 7, 8]
Run Code Online (Sandbox Code Playgroud)