Javascript数组与数字索引没有未定义
javascript array with numeric index without undefineds
假设我……
var arr = Array();
var i = 3333;
arr[i] = "something";
如果你对这个数组进行字符串化它将返回一个字符串,其中包含一大堆未定义的数字项对于那些索引小于3333的项…
是否有办法使javascript不这样做?
我知道我可以使用对象{},但我宁愿不这样做,因为我想做数组操作,如shift()等,不可用于对象
如果您根据OP创建一个数组,它只有一个属性名为"333"且长度为334的成员,因为长度总是被设置为至少比最高索引大1。例如
var a = new Array(1000);
的长度为1000,没有成员,
var a = [];
var a[999] = 'foo';
的长度为1000,并且有一个成员的属性名为"999"。
只获取已定义成员的快速方法是使用for..in:
function myStringifyArray(a) {
var s = [];
var re = /^'d+$/;
for (var p in a) {
if (a.hasOwnProperty(p) && re.test(p)) {
s.push(a[p]);
}
}
return '' + s;
}
注意,返回的成员可能是无序的。如果这是一个问题,您可以使用for循环来代替,但是对于非常稀疏的数组,它会变慢:
function myStringifyArray(a) {
var s = [];
var re = /^'d+$/;
for (var i=0, iLen=a.length; i<iLen; i++) {
if (a.hasOwnProperty(i)) {
s.push(a[i]);
}
}
return '' + s;
}
在一些旧的浏览器中,迭代数组实际上创建了缺失的成员,但我不认为这在现代浏览器中是有问题的。
请彻底测试上述内容。
数组的文字表示必须包含数组的所有项,否则第3334项将不会在索引3333处结束。
你可以将数组中所有未定义的值替换为你想要用作空项的其他值:
for (var i = 0; i < arr.length; i++) {
if (typeof arr[i] == 'undefined') arr[i] = '';
}
另一种选择是构建自己的stringify方法,它将创建赋值而不是数组字面量。例如,而不是像这样的格式:
[0,undefined,undefined,undefined,4,undefined,6,7,undefined,9]
你的方法会创建如下内容:
(function(){
var result = [];
result[0] = 0;
result[4] = 4;
result[6] = 6;
result[7] = 7;
result[9] = 9;
return result;
}())
但是,这样的格式当然与JSON不兼容,如果这是你需要的。
相关文章:
- 传递给 PHP 表单时 JavaScript 动态变量上的未定义索引
- angular.js:13424 ReferenceError:在控制器中使用工厂方法时未定义索引
- 如何删除cookie错误注意:PHP上的未定义索引
- 某些浏览器中cookie的未定义索引
- 以 $_POST 为单位的未定义索引,具有多项选择
- 带有PHP(未定义索引)的Youtube API V3 GET横幅图像
- Firebase 未定义索引
- 未定义索引:通过AJAX传递的PHP变量
- 如何摆脱下面的未定义索引
- ExtJS-组合框中记录的未定义索引
- PHP未定义索引的文件上载问题
- jquery ajax请求中出现未定义索引错误
- 获取'未定义索引'错误'与上面的'字段
- PHP -注意:未定义索引:不显示数据
- 当尝试将值从Jquery传递到PHP时,未定义索引名称
- AJAX调用成功,但抛出未定义索引错误
- Php mysql未定义索引错误使用jquery从一个页面传输数据到另一个页面
- Json解码未定义索引
- Json_decode未定义索引,但值在那里
- php和ajax的未定义索引