如何从嵌套数组中删除空值

时间:2018-11-22 18:57:35

标签: javascript arrays

此代码从数组中删除所有空值:

var array = [ 0, 1, null, 2, "", 3, undefined, 3,,,,,, 4,, 4,, 5,, 6,,,, ];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

但是,当我在具有空值的嵌套数组的数组上尝试此操作时,不会删除空值:

var array = [ [ 1, null, 2 ], [ 3, null, 4 ], [ 5, null, 6 ] ];

var filtered = array.filter(function (el) {
  return el != null;
});

console.log(filtered);

预期输出为:

[ [ 1, 2 ], [ 3, 4 ], [ 5, 6 ] ]

代替实际输出:

[ [ 1, null, 2 ], [ 3, null, 4 ], [ 5, null, 6 ] ]

如何更改示例以从嵌套数组中过滤空值?

5 个答案:

答案 0 :(得分:2)

如果您的数组只有一个级别,那么您可以像这样map

var filtered = array.map(subarray => subarray.filter(el => el != null));
console.log(filtered);

答案 1 :(得分:1)

您的示例将删除undefined值和null值,并且您的预期输出反映了这一点,因此,我假设您的意思是要递归删除两个{{1 }}和undefined值。您的示例使用loose equality comparison,这意味着它将同时匹配nullnull。在起作用时,最好使用undefined进行严格的相等比较,明确要检查的内容。

您将需要使用递归:

  

递归

     

函数调用自身的行为。递归用于解决包含较小子问题的问题。

     

-https://developer.mozilla.org/en-US/docs/Glossary/Recursion

这也意味着您将要使用Array#reduce而不是===。使用新的数组作为累加器。

然后针对输入数组中元素不为null或未定义的每个元素:

  • 如果元素是Array的实例,则将在元素上调用此函数的结果推送到累加器数组上,
  • 否则将元素推到累加器数组上

在reduce回调的末尾将累加器数组作为累加器返回

Array#filter

答案 2 :(得分:0)

var filterFn = function(item) {
    if (item instanceof Array) {
        // do this if you want to remove empty arrays:
        var items = item.splice(0).filter(filterFn);
        var length = items.length;
        Array.prototype.push.apply(item, items);
        return length;
        // if you want to keep empty arrays do this:
        var items = item.splice(0);
        Array.prototype.push.apply(item, items.filter(filterFn))
        return true;
    }
    return item != null;
};
array = array.filter(filterFn);

由于它是递归的,因此也可以在两个以上的级别上工作。

答案 3 :(得分:0)

var arraylist = [0, 1, null, 5];
var i = arraylist.length;
var j =0;
var newlist = [];

while(j < i){

if(arraylist[j] != null){

    newlist.push(arraylist[j]);

}

j++;
}

console.log(newlist);

https://jsfiddle.net/L4nmtg75/

答案 4 :(得分:0)

您需要递归过滤null,如下所示:

function removeNull(array) {
  return array
    .filter(item => item !== null)
    .map(item => Array.isArray(item) ? removeNull(item) : item);
}

此函数接受一个数组,并递归删除所有null实例。

首先,我采用了您的解决方案并将其包装在一个函数中,以便能够对其进行调用。

然后,在过滤掉项目之后,就像映射其余项目一样简单,检查每个项目是否为数组,然后对每个项目都调用removeNull。

编辑:本来我的代码中有错字,但现在应该可以使用。