我需要处理一些包含undefined
值的数组,如下所示:
[ 1, 1, 1, 1, 1, , 1, 1 ]
[ 1, , 1, , , 1, 1 ]
[ 1, , , , , 1, 1 ]
我需要实现不删除undefined
值,但我需要用零替换。
我尝试使用underscore.js来实现这一目标;没有成功。
以下是我的解决方案尝试:
binarymap = _.map(binarymap, function(curr){
// let's replace all undefined with 0s
if(_.isUndefined(curr)) {
return 0;
}
return curr;
});
不幸的是,它不起作用。 underscore.js 的函数_.map
完全忽略undefined
个值。
有什么想法吗?优雅的解决方案?
答案 0 :(得分:5)
这里的实际问题是missing array elements,
数组元素可以在开头,中间或结尾处省略 元素清单。每当元素列表中的逗号前面没有逗号时 AssignmentExpression(即开头或之后的逗号 另一个逗号),缺少的数组元素有助于长度 数组并增加后续元素的索引。 Elided数组 元素没有定义。如果元素在结尾处被省略 数组,该元素不会影响数组的长度。
而Array.prototype.map
会跳过所有缺少的数组元素
仅对实际的数组元素调用callbackfn 存在;它不会被称为缺少数组的元素。
因此,为了使map
函数能够考虑数组元素,我能想到的最简单的方法是稍微调整一下你的方法,比如
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 ]
在这里,Array.apply
(实际上是Function.prototype.apply
)做了重要的事情,将缺失的元素转换为undefined
。
console.log(Array.apply(null, arr));
# [ 1, undefined, undefined, undefined, undefined, 1, 1 ]
答案 1 :(得分:2)
这是你的意思吗??
var arr = [ 1, , , , , 1, 1 ];
for( var i = 0; i < arr.length; i++ ) {
if( typeof(arr[i])==="undefined" ) {
arr[i] = 9;
}
}
console.log( arr );
// yields [1, 9, 9, 9, 9, 1, 1]
答案 2 :(得分:2)
自发布以来可能发生了一些变化,但underscore(v1.8.3)和lodash(v4.13.1)处理得非常好:
var u = [1, , , , , 1, 1];
_.map(u, function(n) { return n || 0; });
// [1, 0, 0, 0, 0, 1, 1]
本机循环跳过未定义的条目,因为它们显式地仅循环遍历数组的{em>已定义元素(ref)。源数组不包含undefined
个元素,它包含从未定义过的元素。
这些数组不同:
[1, undefined, 1]
[1, , 1]
第一个数组将其第一个索引定义为undefined
第二个数组根本没有定义第一个索引
两者的长度均为3。
这感觉它开始进入WAT条纹,但这是一个值得了解的细微差别。
由于我们已经处于杂草状态,因此我在现实生活中从未使用过一种复杂的原生解决方案:
var u = [1, , , , , 1, 1];
Array(u.length).join(0).split('').map(function(n, i) { return u[i] || 0; })
// [1, 0, 0, 0, 0, 1, 1]
Array(u.length).join(0).split('')
产生一个任意字符串的虚拟数组,然后可以映射。 map函数通过索引引用原始数组,然后使用简单的布尔值开关返回定义的值或零。
答案 3 :(得分:0)
如果只需要从数组中删除空元素,则不需要使用下划线,只需遍历数组,删除splice
的空元素。
您可以在javascript中添加该功能原型Array类:
var array = [ 1, 1, , , , , 1, 1 ];
Array.prototype.replaceEmptyElements = function(value) {
for (var i = 0; i < this.length; i++) {
if (typeof this[i] == "undefined") {
this[i] = value;
}
}
return this;
};
var val = //your value
array.replaceEmptyElements(val);
答案 4 :(得分:0)
如果您愿意,可以将该功能添加为mixin以用于下划线链。从here即兴创作。
_.mixin({
dothis: function(obj, interceptor, context) {
return interceptor.call(context, obj);
}
});
function resetArray(arr) {
for (var i = 0, l = arr.length; i < l; i++) {
if (arr[i] === undefined) arr[i] = 0;
}
return arr;
}
var arr = [ 1, , , , , 1, 1 ];
_(arr)
.chain()
.dothis(resetArray)
.tap(console.log) // [1, 0, 0, 0, 0, 1, 1]
编辑:实际上,有一种更简单的方法:
_.mixin({
resetArray: function (arr) {
for (var i = 0, l = arr.length; i < l; i++) {
if (arr[i] === undefined) arr[i] = 0;
}
return arr;
}
});
var arr = [1, , , , , 1, 1];
_(arr)
.chain()
.resetArray()
.tap(console.log)