从 Array 中移除未定义的值

在某些情况下,可能会发生在数组结构中有 undefined或通常是 假的值的情况。例如,当从一些未知来源(如数据库或 HTML 结构)读取和填充数据时。喜欢

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

由于这可能会在循环处理这些数组和处理元素时引起麻烦,那么删除 undefined(假值)的最佳实践是什么?

202078 次浏览

To use Array.prototype.filter here might be obvious. So to remove only undefined values we could call

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


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

If we want to filter out all the falsy values (such as 0 or null) we can use return !!element; instead.

But we can do it slighty more elegant, by just passing the Boolean constructor function, respectively the Number constructor function to .filter:

data = data.filter( Number );

That would do the job in this instance, to generally remove any falsy value, we would call

data = data.filter( Boolean );

Since the Boolean() constructor returns true on truthy values and false on any falsy value, this is a very neat option.

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);

Array.prototype.reduce() can be used to delete elements by condition from an array but with additional transformation of the elements if required in one iteration.


Remove undefined values from array, with sub-arrays support.

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));

Try it on jsfiddle.net/bjoy4bcc/

Inline using lambda

result.filter(item => item);

You can use lodash compact method, which removes null, undefined and ''.

_.compact(data)
var arr1 = [NaN, 0, 15, false, -22, '',undefined, 47, null];


var array1 = arr1.filter(function(e){ return e;});


document.write(array1);

single lined answer

If you have an array of objects and want to remove all null and undefined items:

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

As Diogo Capela said, but where 0 is not filtered out as well.

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

in ES6 this can be achieved by simply using using filter with function return the value like this:

const array = [NaN, 0, 15, false, -22, '',undefined, 47, null];
const filteredArr = array.filter(elm => elm);
console.log(filteredArr);
var data = Object.keys(data)

This will remove undefined values but array index will change

ES6 single line

data.filter(e => e)

The solution with Array.filter will actually keep the array unchanged and create a new array without the undesired items. If you want to clean an array without duplicating it, you can use this:

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

Is the most short and readable way to do it.

[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]