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;iArray.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);
您可以使用lodashcompact
方法,该方法删除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 ]