替换数组中缺失/未定义值的最佳方法?

fst*_*tab 2 javascript arrays list map underscore.js

我需要处理一些包含undefined值的数组,如下所示:

[ 1, 1, 1, 1, 1, , 1, 1 ]
[ 1, , 1, , , 1, 1 ]
[ 1, , , , , 1, 1 ]
Run Code Online (Sandbox Code Playgroud)

我需要实现的不是删除undefined值,但我需要用零替换它们.

我尝试使用underscore.js来实现这一目标; 没有成功.

以下是我的解决方案尝试:

binarymap = _.map(binarymap, function(curr){
    // let's replace all undefined with 0s
    if(_.isUndefined(curr)) {
        return 0;
    }
    return curr;
});
Run Code Online (Sandbox Code Playgroud)

不幸的是,它不起作用.underscore.js的功能_.map完全忽略了undefined价值观.

有任何想法吗?优雅的解决方

the*_*eye 5

这里的实际问题是缺少数组元素,

可以在元素列表的开头,中间或末尾省略数组元素.每当元素列表中的逗号前面没有AssignmentExpression(即开头的逗号或另一个逗号后面的逗号)时,缺少的数组元素会增加数组的长度并增加后续元素的索引.未定义Elided数组元素.如果在数组的末尾省略了元素,则该元素不会影响数组的长度.

并Array.prototype.map跳过所有缺少的数组元素,

callbackfn仅针对实际存在的数组元素调用; 它不会被调用缺少数组的元素.

所以,为了让map函数考虑到Array元素,我能想到的最简单的方法是调整你的方法,比如这个

var arr = [ 1, , , , , 1, 1 ];
console.log(_.map(Array.apply(null, arr), function (currentItem) {
    return _.isUndefined(currentItem) ? 0 : currentItem;
}));
# [ 1, 0, 0, 0, 0, 1, 1 ]
Run Code Online (Sandbox Code Playgroud)

在这里,Array.apply(实际上Function.prototype.apply)做了重要的事情,将缺失的元素转换为undefined.

console.log(Array.apply(null, arr));
# [ 1, undefined, undefined, undefined, undefined, 1, 1 ]
Run Code Online (Sandbox Code Playgroud)