如何删除包含所有空值的数组列

How can I remove array columns with all null values?

本文关键字:空值 数组 包含所 何删除 删除      更新时间:2023-09-26

假设我有这个数组,

[
  ["First", "Second", "Third", "Fourth", "Fifth", "Sixth", "Seventh"],
  ["A"    , 1       , 2      , 3       , 4      , 5      , null     ],
  ["B"    , 1       , 2      , null    , null   , 5      , null     ],
  ["C"    , null    , 2.5    , 3       , 4      , 5      , null     ],      
]

现在,它是字符串、整数、浮点数/双精度数和空值的混合。在最后一列中,每个值都是空的,我需要删除该列(忽略第一行不为空的事实)。

我能想到的唯一方法是遍历整个数组(和子数组),并为每列保留一个布尔值,说明是否所有值都是 null,然后再次遍历它,如果列完全为 null,则删除索引。

这对我来说似乎效率很低,我想知道是否有更好的方法可以做到这一点。

只是为了让你有一个想法,输出数组,需要这样。

[
  ["First", "Second", "Third", "Fourth", "Fifth", "Sixth"],
  ["A"    , 1       , 2      , 3       , 4      , 5      ],
  ["B"    , 1       , 2      , null    , null   , 5      ],
  ["C"    , null    , 2.5    , 3       , 4      , 5      ],      
]
// The "Seventh" column was removed due to all it's values being null.

我将设置一个 jsfiddle 示例,完成后我将编辑链接。

这是我对循环想法的粗略概念证明。

这样的东西应该可以解决问题

function remove(arr) {
   var toRemove = Array.apply(null, new Array(arr[0].length)).map(function(_, i){return i;});
   arr.slice(1).forEach(function(row){
      toRemove = toRemove.filter(function(index){//filter only values that left
         return row[index] === null;
      });
   });
  return arr.map(function(row){
      return row.filter(function(_, i){
        return toRemove.indexOf(i) < 0;
     });
  });
}