Как эффективно удалить пустые столбцы в 2D Array в Javascript - PullRequest
0 голосов
/ 10 марта 2019

У меня есть следующий массив массивов (2D Array)

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

Как удалить пустые столбцы из указанного массива.

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

Я пытаюсь, но не могу завершить.

  removeEmptyColumns(csvData) {
    for (let i = 0; i < csvData.length; i++) {
      let col = csvData.map(function (value, index) { return value[i]; });
      for (let j = 0; j < col.length; j++) {
        if (col[j])
          break;
      }

    }

  }

Ответы [ 2 ]

2 голосов
/ 10 марта 2019

Вы можете получить сначала заполненный столбец, а затем отфильтровать массивы.

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 голос
/ 10 марта 2019

Используйте 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))
}
...