从数组中删除未定义的值
Removing undefined values from Array
在某些情况下,我们可能会在数组结构中出现undefined
或通常错误的值。例如,当从一些未知来源(如数据库或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;
});
如果我们想过滤掉所有 falsy 值(例如 0 或 null(,我们可以改用return !!element;
。
但是我们可以做得稍微优雅一点,只需将Boolean
构造函数(分别Number
构造函数(传递给.filter
:
data = data.filter( Number );
在这种情况下,这将完成工作,通常删除任何虚假值,我们将称为
data = data.filter( Boolean );
由于 Boolean()
构造函数返回真值true
,false
任何假值,这是一个非常简洁的选项。
使用 lambda 内联
result.filter(item => item);
lodash compact
方法,该方法删除null
、undefined
和 ''
。
_.compact(data)
[NaN, undefined, null, 0, 1, 2, 2000, Infinity].filter(Boolean)
//[ 1, 2, 2000, Infinity ]
如果您有一个对象数组,并且想要删除所有null
和undefined
项:
[].filter(item => !!item);
ES6 单行
data.filter(e => e)
data.filter(Boolean)
是最简短和可读的方法。
正如迪奥戈·卡佩拉所说,但 0 也没有被过滤掉。
[].filter(item => item !== undefined && item !== null)
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 arr1 = [NaN, 0, 15, false, -22, '',undefined, 47, null];
var array1 = arr1.filter(function(e){ return e;});
document.write(array1);
单行答案
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));
试穿 jsfiddle.net/bjoy4bcc/
在 ES6 中,这可以通过简单地使用过滤器和函数返回值来实现,如下所示:
const array = [NaN, 0, 15, false, -22, '',undefined, 47, null];
const filteredArr = array.filter(elm => elm);
console.log(filteredArr);
带有 Array.filter
的解决方案实际上将保持数组不变并创建一个没有不需要的项目的新数组。如果要清理数组而不复制它,可以使用以下命令:
for (var i = data.length-1; i >= 0; i--) {
if (!data[i]) {
data.splice(i, 1);
}
}
如果您在 Typescript 中并且想要从 Array<string|undefined>请尝试以下之一...
var arr = ['a', 'b', 'c', undefined, 'e', undefined, 'g'];
var solutionA = arr.reduce((acc, item) => {
item && acc.push(item);
return acc;
}, []);
console.log('solution a', solutionA);
var solutionB = [];
arr.forEach((each) => each && solutionB.push(each), []);
console.log('solution b', solutionB);
arr.forEach((each,index) => (!each) && arr.splice(index,1),[]);
console.log('solution c', arr);
var data = Object.keys(data)
这将删除未定义的值,但数组索引将更改
- 未捕获的类型错误:无法读取属性'删除'的未定义
- 隐藏或删除图像 src=未定义
- 从angularjs中的下拉列表中删除未定义的值
- 主干->无法调用方法'删除'的未定义
- 从数组中删除未定义的值
- 如何删除cookie错误注意:PHP上的未定义索引
- 如何删除未定义的对象错误并根据位置重定向用户
- 如何使用下划线从对象内的数组中删除空的、空的、未定义的值
- 删除警报时,变量将变为未定义
- 使用React删除Firebase中的项,重新渲染会返回未定义的项
- IE9无法获取属性'删除'的未定义引用或null引用
- 如何设置为未定义或删除某些部分
- 如何删除宽度是jQuery中未定义的错误
- Javascript -从对象中删除未定义字段
- 未定义:不删除javascript数组
- 删除对象成员而不留下未定义的最好方法是什么?
- 删除JavaScript数组元素显示未定义
- 删除确认返回未定义在chrome中
- 主干模型删除未定义属性
- 当对象被删除时,布尔数组是未定义的