【问题标题】:How to remove empty elements in a multidimensional array using Javascript如何使用Javascript删除多维数组中的空元素
【发布时间】:2021-01-23 19:52:04
【问题描述】:

这里的初学者程序员正在尝试构建一个工具来让我的生活更轻松。我可以从 Google 工作表中提取数据,但它看起来像下面的数组,在我想要捕获的元素(Person、Person2 等)和它们周围都有很多空元素。这是由于工作表的格式,我无法删除它周围的空单元格。

var array = [[Person1,, Age1,, Address1], [,,,,], [Person2,, Age2,, Address2], [,,,,] ...]

我假设有一种简单的方法可以过滤数组并删除空/空项。但是我尝试使用 .filter() 和嵌套的 for 循环没有奏效。任何人都可以帮助获得没有空项的多维数组的最佳方法吗?

【问题讨论】:

  • 你能分享一个真实的数组吗?这样会更容易帮助你...

标签: javascript google-apps-script multidimensional-array null


【解决方案1】:

您可以使用reduce 函数并删除nullarraylength 的项目

var arr = [["Person1", null, "Age1", null, "Address1"]
  , [null, null, null, null, null]
  , ["Person2", null, "Age2", null, "Address2"],
[null, null, null, null, ["t"]]]

function reducer(res, item) {
  if (!item) return res;
  if (Array.isArray(item)) {
    var obj = item.reduce(reducer, [])
    if (obj.length > 0) {
      res.push(obj)
    }
    return res;
  }
  res.push(item);
  return res;
}

var res = arr.reduce(reducer , [])
console.log(res)

【讨论】:

  • 你不应该在普通 JS 中使用 var,但至少它可以运行。我只是希望这个答案不是从另一个问题中偷来的(因为在 2020 年的答案中你还能如何获得 var ?)
【解决方案2】:

幸运的是,您只有一个二维数组,它是一维数组的列表。

让我们从一维数组开始:

var row = ['a','b',,'c',,];


// via a loop:

var new_row = [];
for (cel in row) if (row[cel]) new_row.push(row[cel]);

console.log(new_row); // ['а', 'b', 'c']


// via a filter() function:

var new_row_f = row.filter((cel) => cel);

console.log(new_row_f); // ['a', 'b', 'c']

这是一个二维数组:

var table = [['a1','b1',,'c1',,],[,,,,,],['a2','b2',,'c2',,]]


// via nested loops:

var new_table = []
for (var row=0; row<table.length; row++) {
    var new_row = [];
    for (var cel=0; cel<table[row].length; cel++) {
        var new_cel = table[row][cel];
        if (new_cel) new_row.push(new_cel);
    }
    if (new_row.join("")!="") new_table.push(new_row);
}

console.log(new_table); // [ [ 'a1', 'b1', 'c1' ], [ 'a2', 'b2', 'c2' ] ]


// via a chain of filter() & map(filter()) functions:

var new_table_f = table.filter(row => row.join("") != "")
                       .map(row => row.filter((cel) => cel));

console.log(new_table_f); // [ [ 'a1', 'b1', 'c1' ], [ 'a2', 'b2', 'c2' ] ]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-09
    • 1970-01-01
    • 2018-05-07
    • 2012-04-27
    • 2016-08-11
    • 2021-03-24
    • 1970-01-01
    相关资源
    最近更新 更多