如何有效地删除Javascript中的2D数组中的空列

时间:2019-03-09 22:49:56

标签: javascript arrays csv multidimensional-array data-structures

我有以下数组数组(二维数组)

train()

如何从上面的数组中删除空列。

Input    csvData = [["", "2", "",  ""], ["", "3", "", ""], ["", "", "4", ""]]

我正在尝试但无法完成。

   Output   csvData = [[ "2", ""], ["3", ""], ["","4"]]

2 个答案:

答案 0 :(得分:2)

您可以先获取填充列,然后过滤数组。

var csvData = [["", "2", "",  ""], ["", "3", "", ""], ["", "", "4", ""]],
    columns = csvData.reduce(
        (r, a) => (a.forEach((v, i) => r[i] = r[i] || v), r),
        []
    );

csvData = csvData.map(a => a.filter((_, i) => columns[i]));

console.log(csvData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

仅删除最后一个空列,可以获取已填充列的最大值,然后删除其余列。

var csvData = [["", "2", "",  ""], ["", "3", "", ""], ["", "", "4", ""]],
    max = csvData.reduce(
        (r, a) => (a.forEach((v, i) => v && (r = Math.max(r, i))), r),
        0
    );

csvData = csvData.map(a => a.slice(0, max + 1));

console.log(csvData);
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:1)

Array.reduce()Array.some()一起使用以标识空列。

然后使用Array.map()迭代数组,并使用Array.filter()删除空列中的项目。

const removeEmptyColumns = arr => {
  // detect empty columns
  const emptyColumns = (arr[0] || []).map((c, i) => arr.some(a => a[i]))
  
  // filter empty columns
  return arr.map(a => a.filter((_, i) => emptyColumns[i]))
}

pp(removeEmptyColumns([["", "2", "",  ""], ["", "3", "", ""], ["", "", "4", ""]]))

pp(removeEmptyColumns( [["1", "2", "", "4"], ["", "3", "", ""], ["", "", "", "2"]]
))

function pp(d) {
  console.log(JSON.stringify(d))
}