从数组中删除未定义的值

Removing undefined values from Array

本文关键字:未定义 删除 数组      更新时间:2024-02-13

在某些情况下,我们可能会在数组结构中出现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() 构造函数返回真值truefalse任何值,这是一个非常简洁的选项。

使用 lambda 内联

result.filter(item => item);
您可以使用

lodash compact 方法,该方法删除nullundefined''

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

如果您有一个对象数组,并且想要删除所有nullundefined项:

[].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)

这将删除未定义的值,但数组索引将更改