Javascript 从数组中删除未定义的值

Javascript 从数组中删除未定义的值,javascript,arrays,filter,Javascript,Arrays,Filter,在某些情况下,数组结构中可能存在未定义的或通常不正确的值。例如,当从一些未知源(如数据库或HTML结构)读取和填充数据时。像 var data = [42, 21, undefined, 50, 40, undefined, 9] 由于在此类数组上循环并处理元素时可能会出现问题,因此删除未定义的(错误值)的最佳实践是什么?使用数组.prototype.filter这里可能很明显。因此,为了只删除未定义的值,我们可以调用 var data = [42, 21, undefined, 50, 40

在某些情况下,数组结构中可能存在
未定义的
或通常不正确的值。例如,当从一些未知源(如数据库或HTML结构)读取和填充数据时。像

var data = [42, 21, undefined, 50, 40, undefined, 9]

由于在此类数组上循环并处理元素时可能会出现问题,因此删除
未定义的
(错误值)的最佳实践是什么?使用
数组.prototype.filter
这里可能很明显。因此,为了只删除未定义的值,我们可以调用

var data = [42, 21, undefined, 50, 40, undefined, 9];

data = data.filter(function( element ) {
   return element !== undefined;
});
如果我们想过滤掉所有的falsy值(例如0或null),我们可以使用
return!!元素取而代之

但是我们只需将
Boolean
构造函数,分别将
Number
构造函数传递给
。filter
,就可以做得稍微优雅一点:

data = data.filter( Number );
在本例中,这将完成工作,一般来说,为了删除任何虚假值,我们将调用

data = data.filter( Boolean );

由于
Boolean()
构造函数在truthy值上返回
true
,在任何falsy值上返回
false
,因此这是一个非常简洁的选项。

var a=[“3”,“6”];
var a =  ["3","", "6"];
var b =  [23,54,56];
var result = [];

for (var i=0;i<a.length;++i) {
    if (a[i] != "") {
        result[i] = b[i];
    }
}

result = result.filter(function( element ) {
   return element !== undefined;
});

console.log(result);
var b=[23,54,56]; var结果=[];
for(var i=0;i
Array.prototype.reduce()
可用于按条件从数组中删除元素,但如果在一次迭代中需要,还可对元素进行额外转换


使用子数组支持,从数组中删除
未定义的

function transform(arr) {
    return arr.reduce((memo, item) => {
        if (typeof item !== "undefined") {
            if (Array.isArray(item)) item = transform(item);
            // We can transform item here.
            memo.push(item);
        }
        return memo;
    }, []);
}

let test1 = [1, 2, "b", 0, {}, "", , " ", NaN, 3, undefined, null, 5, false, true, [1, true, 2, , undefined, 3, false, ''], 10];

console.log(transform(test1));

使用lambda内联试穿它

result.filter(item => item);

您可以使用lodash
compact
方法,该方法删除
null
未定义的
'


单行回答

如果您有一个对象数组,并且希望删除所有
null
未定义的
项:

[].filter(item => !!item);

正如迪奥戈·卡佩拉所说,0也没有被过滤掉

[].filter(item => item !== undefined && item !== null)

在ES6中,只需使用filter函数返回如下值即可实现:

const array = [NaN, 0, 15, false, -22, '',undefined, 47, null];
const filteredArr = array.filter(elm => elm);
console.log(filteredArr);
这将删除未定义的值,但数组索引将更改为单行

data.filter(e => e)

使用
Array.filter
的解决方案实际上会保持数组不变,并创建一个没有不需要的项目的新数组。如果要在不复制数组的情况下清理数组,可以使用以下方法:

for (var i = data.length-1; i >= 0; i--) {
    if (!data[i]) {
        data.splice(i, 1);
    }
}
data.filter(布尔值)

这是最简单易读的方法。

这个怎么样?请注意
过滤器(数字)
还将删除
0
。这还将删除错误值,如
false
,这些值可能存在于array@jAndy谢谢。它也解决了我在IE 11中的问题。早些时候我使用了箭头函数来删除未定义的。如果你刚才说“…该死…”,这可以缩短为
.filter(n=>n!==undefined)
在你的呼吸下,那么你就是一个正式的像我一样的书呆子!这一个将删除所有错误值。因为OP指定的错误值是不需要的,这绝对是最好的答案。但是,你也会特别指出在哪一点你想要
结果。过滤器(item=>item!==undefined)
[true,false,未定义,null,'a',1,0','0'].过滤器(x=>x)
返回
[true,“a”,1,“0”]
这里的最佳答案是,如果没有另一个库,它是无法免费提供的。这会导致工作过度,并清理数组。这是我喜欢的解决方案。这里应该有更多代码吗?所有这些都将返回一个数字为0-6的数组。为什么这样做?不要只是发布“魔法”还要解释它是如何工作的以及为什么这是一个好的解决方案。
[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]
data.filter(e => e)
for (var i = data.length-1; i >= 0; i--) {
    if (!data[i]) {
        data.splice(i, 1);
    }
}
[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]