Javascript 替换数组中缺少/未定义值的最佳方法?
我需要处理一些包含Javascript 替换数组中缺少/未定义值的最佳方法?,javascript,arrays,list,map,underscore.js,Javascript,Arrays,List,Map,Underscore.js,我需要处理一些包含未定义值的数组,如下所示: [ 1, 1, 1, 1, 1, , 1, 1 ] [ 1, , 1, , , 1, 1 ] [ 1, , , , , 1, 1 ] 我需要实现的是不是删除未定义的值,而是用零替换它们 我试图用它来实现这一目标;没有成功 以下是我的解决方案尝试: binarymap = _.map(binarymap, function(curr){ // let's replace all undefined with 0s if(_.isUnd
未定义值的数组,如下所示:
[ 1, 1, 1, 1, 1, , 1, 1 ]
[ 1, , 1, , , 1, 1 ]
[ 1, , , , , 1, 1 ]
我需要实现的是不是删除未定义的
值,而是用零替换它们
我试图用它来实现这一目标;没有成功
以下是我的解决方案尝试:
binarymap = _.map(binarymap, function(curr){
// let's replace all undefined with 0s
if(_.isUndefined(curr)) {
return 0;
}
return curr;
});
不幸的是,它不起作用。Underline.js的函数\uwMap
完全忽略未定义的值
有什么想法吗?优雅的解决方案?你的意思是
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]
var-arr=[1,1,1];
对于(变量i=0;i
如果您只需要从数组中删除空元素,则不需要使用下划线,只需使用拼接
在数组上迭代删除空元素即可
您可以在javascript中添加该功能原型阵列类:
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);
var数组=[1,1,1,1];
Array.prototype.replaceEmptyElements=函数(值){
for(var i=0;i
如果需要,可以将该函数添加为mixin,以便在下划线链中使用。即兴创作的
混合({
dothis:函数(obj、拦截器、上下文){
返回拦截器调用(上下文,obj);
}
});
函数重置数组(arr){
对于(变量i=0,l=arr.length;i
编辑:实际上,有一种更简单的方法:
_.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)
混合({
resetArray:函数(arr){
对于(变量i=0,l=arr.length;i
这里的实际问题是
数组元素可以在数组的开头、中间或结尾省略
元素列表。只要元素列表中的逗号前面没有
赋值表达式(即,开头或后面的逗号
另一个逗号),缺少的数组元素会导致
数组,并增加后续元素的索引。省略阵列
未定义元素。如果一个元素在一个
数组,则该元素不影响数组的长度
并跳过所有缺少的数组元素
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
(实际上是函数.prototype.apply
)做了一件重要的事情,将缺少的元素转换为未定义的
console.log(Array.apply(null, arr));
# [ 1, undefined, undefined, undefined, undefined, 1, 1 ]
这篇文章发布后可能发生了一些变化,但(v1.8.3)和(v4.13.1)都很好地处理了这一点:
var u = [1, , , , , 1, 1];
_.map(u, function(n) { return n || 0; });
// [1, 0, 0, 0, 0, 1, 1]
本机循环跳过未定义的项,因为它们只显式循环数组()的已定义元素。源数组不包含未定义的元素,它包含从未定义过的元素
这些阵列不同:
[1, undefined, 1]
[1, , 1]
第一个数组将其第一个索引定义为undefined
第二个数组根本不定义第一个索引。
两者的长度均为3
这感觉像是开始进入边缘,但这是一个微妙的区别值得知道
由于我们已经陷入困境,有一个复杂的本地解决方案我在现实生活中从未使用过:
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]
数组(u.length).join(0).split(“”)
生成一个任意字符串的虚拟数组,然后可以映射到该数组上。map函数按索引引用原始数组,然后使用简单的布尔开关返回定义的值或零 我想您不能使用map
函数,我在chrome[1,1,1].map(function(){console.log(arguments);})代码>并且我只有3倍的输出,而不是8倍或更多so@EricG确切地说,这就是为什么我想知道是否有一个好的替代方法。我怀疑下划线使用了所有可用的最新数组方法,并且我非常确定映射
,过滤器
等都忽略了未定义的
值。如果您查看标准部分和,Array#map
实际上应该是这样工作的,忽略数组中存在的未定义值。太脏了,但我不得不分享:var arr=[1,1,1,1,1];arr=JSON.parse(JSON.stringify(arr.replace)(/null/g,0))是的,这就是我的意思。但是我想知道我是否可以通过使用下划线.js的函数或类似的函数来实现一个优雅的解决方案{…
看起来更好,我想。@c-smile这是一个安全的东西,可以防止当有人写var undefined=12
@francescostablum时出错。我不能给你一个更优雅的解决方案,我不太熟悉下划线js。我只能给你一个解决方案。@EricG在这种偏执的情况下,你可以使用var nothing={}.nothing;
并将其与该值进行比较。这将比字符串比较更有效。我相信这个array=array.filter(function(){return true;})
将对该purpose更有效。@c-smile他不想筛选,他想为未定义的
值设置另一个值(即长度应保持不变)@francesco,我刚刚添加了一个更新,以获得更简单的解决方案。
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]