从数组中删除未定义的值
Removing undefined values from Array
在某些情况下,我们可能会在数组结构中有 undefined
或通常 falsy 值。例如,当从数据库或 HTML 结构等未知来源读取和填充数据时。喜欢
var data = [42, 21, undefined, 50, 40, undefined, 9]
由于在遍历此类数组和处理元素时可能会导致麻烦,因此删除 undefined
(虚假值)的最佳做法是什么?
在这里使用 Array.prototype.filter
可能很明显。因此,要仅删除未定义的值,我们可以调用
var data = [42, 21, undefined, 50, 40, undefined, 9];
data = data.filter(function( element ) {
return element !== undefined;
});
如果我们想过滤掉所有虚假值(例如 0 或 null),我们可以使用 return !!element;
。
但我们可以做得更优雅,只需将 Boolean
构造函数,分别将 Number
构造函数传递给 .filter
:
data = data.filter( Number );
在这种情况下就可以完成工作,通常要删除任何 falsy 值,我们会调用
data = data.filter( Boolean );
因为 Boolean()
构造函数 returns true
在 truthy 值上和 false
在任何 falsy 上 值,这是一个非常简洁的选项。
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()
可用于按条件从数组中删除元素,但如果需要在一次迭代中对元素进行额外转换。
从数组中删除 undefined
个值,支持子数组。
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
、undefined
和 ''
.
_.compact(data)
var arr1 = [NaN, 0, 15, false, -22, '',undefined, 47, null];
var array1 = arr1.filter(function(e){ return e;});
document.write(array1);
单行答案
如果您有一个对象数组并且想要删除所有 null
和 undefined
项:
[].filter(item => !!item);
正如 Diogo Capela 所说,但是 0 也没有被过滤掉。
[].filter(item => item !== undefined && item !== null)
在 ES6 中,这可以通过简单地使用带有函数 return 的过滤器来实现,值如下:
const array = [NaN, 0, 15, false, -22, '',undefined, 47, null];
const filteredArr = array.filter(elm => elm);
console.log(filteredArr);
var data = Object.keys(data)
这将删除未定义的值,但数组索引将更改
ES6单行
data.filter(e => e)
Array.filter
的解决方案实际上将保持数组不变并创建一个没有不需要的项目的新数组。如果你想清理一个数组而不复制它,你可以使用这个:
for (var i = data.length-1; i >= 0; i--) {
if (!data[i]) {
data.splice(i, 1);
}
}
data.filter(Boolean)
是最简短易读的方式。
[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]
在某些情况下,我们可能会在数组结构中有 undefined
或通常 falsy 值。例如,当从数据库或 HTML 结构等未知来源读取和填充数据时。喜欢
var data = [42, 21, undefined, 50, 40, undefined, 9]
由于在遍历此类数组和处理元素时可能会导致麻烦,因此删除 undefined
(虚假值)的最佳做法是什么?
在这里使用 Array.prototype.filter
可能很明显。因此,要仅删除未定义的值,我们可以调用
var data = [42, 21, undefined, 50, 40, undefined, 9];
data = data.filter(function( element ) {
return element !== undefined;
});
如果我们想过滤掉所有虚假值(例如 0 或 null),我们可以使用 return !!element;
。
但我们可以做得更优雅,只需将 Boolean
构造函数,分别将 Number
构造函数传递给 .filter
:
data = data.filter( Number );
在这种情况下就可以完成工作,通常要删除任何 falsy 值,我们会调用
data = data.filter( Boolean );
因为 Boolean()
构造函数 returns true
在 truthy 值上和 false
在任何 falsy 上 值,这是一个非常简洁的选项。
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()
可用于按条件从数组中删除元素,但如果需要在一次迭代中对元素进行额外转换。
从数组中删除 undefined
个值,支持子数组。
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
、undefined
和 ''
.
_.compact(data)
var arr1 = [NaN, 0, 15, false, -22, '',undefined, 47, null];
var array1 = arr1.filter(function(e){ return e;});
document.write(array1);
单行答案
如果您有一个对象数组并且想要删除所有 null
和 undefined
项:
[].filter(item => !!item);
正如 Diogo Capela 所说,但是 0 也没有被过滤掉。
[].filter(item => item !== undefined && item !== null)
在 ES6 中,这可以通过简单地使用带有函数 return 的过滤器来实现,值如下:
const array = [NaN, 0, 15, false, -22, '',undefined, 47, null];
const filteredArr = array.filter(elm => elm);
console.log(filteredArr);
var data = Object.keys(data)
这将删除未定义的值,但数组索引将更改
ES6单行
data.filter(e => e)
Array.filter
的解决方案实际上将保持数组不变并创建一个没有不需要的项目的新数组。如果你想清理一个数组而不复制它,你可以使用这个:
for (var i = data.length-1; i >= 0; i--) {
if (!data[i]) {
data.splice(i, 1);
}
}
data.filter(Boolean)
是最简短易读的方式。
[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]