此代码从数组中删除所有空值:
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 ] ]
如何更改示例以从嵌套数组中过滤空值?
答案 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,这意味着它将同时匹配null
和null
。在起作用时,最好使用undefined
进行严格的相等比较,明确要检查的内容。
您将需要使用递归:
递归
函数调用自身的行为。递归用于解决包含较小子问题的问题。
-https://developer.mozilla.org/en-US/docs/Glossary/Recursion
这也意味着您将要使用Array#reduce
而不是===
。使用新的数组作为累加器。
然后针对输入数组中元素不为null或未定义的每个元素:
在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);
答案 4 :(得分:0)
您需要递归过滤null,如下所示:
function removeNull(array) {
return array
.filter(item => item !== null)
.map(item => Array.isArray(item) ? removeNull(item) : item);
}
此函数接受一个数组,并递归删除所有null实例。
首先,我采用了您的解决方案并将其包装在一个函数中,以便能够对其进行调用。
然后,在过滤掉项目之后,就像映射其余项目一样简单,检查每个项目是否为数组,然后对每个项目都调用removeNull。
编辑:本来我的代码中有错字,但现在应该可以使用。