繁体   English   中英

如何从二维数组中提取多列?

[英]How to extract multiple columns from a two dimension array?

我能否就如何使用 JavaScript 从如下所示的二维数组中提取多列提供一些指导?

Array = [
  [1, 2, 3, 4],
  [5, 6, 7, 8],
  [9,10,11,12],
];

到目前为止,我使用 forEach 或 map 看到的简单方法将允许一次提取一列,有没有办法以某种方式嵌套它以提取所需的任何列索引?

假设期望输出列是 1,2 和 4。

Output = [
  [1, 2, 4],
  [5, 6, 8],
  [9,10,12],
];

编辑:

我需要解决的另一个问题是如何删除一行,如果它是 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],
]; 

所需的输出现在是...

Output = [
  [1, 2, 4],
  [5, 6, 8],
  [9,10,12],
  [21,22,24],
]; 

您可以将arr中的每一行.map()到一个新数组,您可以通过在您希望获得的列/索引数组上使用内部.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);

更多细节:正如您提到的,第一个映射将arr内部的每个内部数组暴露给内部映射函数:

cols.map(i => r[i-1])

该映射函数将遍历cols定义的索引并将它们转换为新值。 例如,假设您是r是第二个数组:

[5, 6, 7, 8]

执行cols.map(...)将遍历[1, 2, 4]每个元素(在回调函数中用i表示)。 对于每个元素,我们将其“转换”为一个新元素:

i = 1
r = [5, 6, 7, 8]
new value: r[1-1] = 5

下一次迭代我们查看cols中的下一个值:

i = 2
r = [5, 6, 7, 8]
new value: r[2-1] = 6

最后,我们看一下cols中的最终值:

i = 4
r = [5, 6, 7, 8]
new value: r[4-1] = 8

因此,映射函数生成一个新数组,该数组将 cols [1, 2, 4]的值转换为当前行中那些索引处的值[5, 6, 8] 这对于每个内部数组/行都会发生,产生最终结果。


编辑根据您的编辑,您可以应用与上面相同的逻辑来获取仅包含您想要的列的数组。 完成后,您可以使用.filter()仅保留在第二列中具有值的行。 在第二列中保留所有具有真值的数组将从结果数组中删除第二列(值)中具有非真值的数组。 0undefined都是 flasy 值,因此不会保留它们。

请参阅下面的示例:

 const arr = [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12], [13,0,15,16], [17, ,19,20], [21,22,23,24], ] const cols = [1, 2, 4]; const col = 2; const res = arr.filter(r => r[col-1]).map(r => cols.map(i => r[i-1])); console.log(res);

如果您有多个要忽略的列,您可以使用.every()来确保每个(即:每个)列都包含一个真值。 如果他们都这样做,那么.every()将返回true ,保留该列,否则,它将返回false ,删除该列:

 const arr = [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12], [13,0,15,16], [ ,17,19,20], [21,22,23,24], ] const cols = [1, 2, 4]; const col = [1, 2]; const res = arr.filter(r => col.every(c => r[c-1])).map(r => cols.map(i => r[i-1])); console.log(res);

您可以通过下面给出的方式来处理它。 解决方案是使用 filter 方法中可用的 index 参数。

Array.filter(currElem,index,array)

由于数组是 0-indexed ,所以我创建了数组,其中您希望在数据中的索引为 [0,1,3] 。 您需要将数据数组和索引数组传递给函数。

 var array = [ [1, 2, 3, 4], [5, 6, 7, 8], [9,10,11,12], ]; var arrIndex = [0,1,3]; function extractData(arr,indexArr) { return arr.map(obj => { return obj.filter((ob,index) => { if(indexArr.includes(index)){return ob} }) }) } console.log(extractData(array,arrIndex));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM