替换数组中缺失/未定义值的最佳方法
Best way to replace missing/undefined values in an array?
我需要处理一些包含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;
});
不幸的是,它不起作用。下划线。js函数_.map
完全忽略undefined
值。
任何想法?优雅的解决方案?
这里的实际问题是缺少数组元素,
数组元素可以省略在元素的开头、中间或结尾元素列表。每当元素列表中的逗号前面没有赋值表达式(即,逗号在开头或后面)另一个逗号),缺少的数组元素有助于的长度数组并增加后续元素的索引。省略数组元素没有定义。的结尾省略了一个元素
和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 ]
你是这个意思吗?
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]
自从发布以来可能发生了一些变化,但是下划线(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]
本机循环跳过未定义的项,因为它们只显式地循环数组的已定义元素(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函数通过索引引用原始数组,然后使用一个简单的布尔开关返回定义的值或零。
如果你想,你可以添加一个函数作为一个mixin在下划线链中使用。从这里即兴创作的
_.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)
小提琴
如果您只需要从数组中删除空元素,则不需要使用下划线,只需使用splice
遍历数组以删除空元素。
你可以在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);
- 有条件更新d3.js力图中节点的最佳方法
- 将jQuery.ech()方法转换为本地JavaScript抽象的最佳方法是什么
- 处理浮点错误的最佳方法是什么
- 从数组中删除元素的最佳方法是:javascript/jquery
- 以编程方式填充组合框道场 (1.8) 的最佳方法是什么?
- 列出没有 mysql 的元素的最佳方法是什么
- 在jquery库中重新定义方法的最佳方法
- Javascript,用vars创建对象的最佳方法
- 使用 jQuery 从 HTML 中获取某些值的最佳方法
- 在变量中保存值的最佳方法是在应用程序关闭后使用,然后使用apachecordova在android中重新启动
- 在d3.json中使用d3.csv组合多个csv文件数据输入的最佳方法是什么
- 用jasmine测试JavaScriptUI的最佳方法
- 使用javascript:在没有阻止html标记(<b>、<p>等)的情况下,阻止脚本的最佳方法
- 如果我返回表,检查 Ajax 调用是否为 200 OK的最佳方法是什么
- JavaScript - 创建可链接函数时的最佳方法是什么
- 在上下文菜单项单击上显示侧边栏/弹出窗口的最佳方法是什么
- 在 JavaScript 中获取范围的随机数的最佳方法
- 在对象类上实现 jquery 作用域的最佳方法
- 将同步函数包装到承诺中的最佳方法是什么?
- 使用 MVC 删除 JavaScript 中硬编码字符串 Asp.Net 最佳方法