Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带数字索引且不带未定义项的javascript数组_Javascript_Arrays_Object - Fatal编程技术网

带数字索引且不带未定义项的javascript数组

带数字索引且不带未定义项的javascript数组,javascript,arrays,object,Javascript,Arrays,Object,我想我会的 var arr = Array(); var i = 3333; arr[i] = "something"; 如果您对这个数组进行字符串化,它将返回一个字符串,其中包含索引小于3333的那些项的一大堆未定义的数字项 有没有办法让javascript不这样做 我知道我可以使用对象{},但我不想使用,因为我想执行数组操作,如shift()等,而这些操作对对象不可用数组的文字表示必须包含数组的所有项,否则3334项将不会在索引3333处结束 可以将数组中所有未定义的值替换为要用作空项的其

我想我会的

var arr = Array();
var i = 3333;
arr[i] = "something";
如果您对这个数组进行字符串化,它将返回一个字符串,其中包含索引小于3333的那些项的一大堆未定义的数字项

有没有办法让javascript不这样做


我知道我可以使用对象{},但我不想使用,因为我想执行数组操作,如shift()等,而这些操作对对象不可用

数组的文字表示必须包含数组的所有项,否则3334项将不会在索引3333处结束

可以将数组中所有未定义的值替换为要用作空项的其他值:

for (var i = 0; i < arr.length; i++) {
  if (typeof arr[i] == 'undefined') arr[i] = '';
}
您的方法将创建如下内容:

(function(){
  var result = [];
  result[0] = 0;
  result[4] = 4;
  result[6] = 6;
  result[7] = 7;
  result[9] = 9;
  return result;
}())

但是,如果您需要JSON,那么这样的格式当然与JSON不兼容。

如果您为OP创建一个数组,它只有一个属性名为“333”且长度为334的成员,因为长度总是设置为至少比最高索引大一个。e、 g

var a = new Array(1000);
长度为1000且无成员

var a = [];
var a[999] = 'foo';
长度为1000,一个成员的属性名为“999”

仅获取已定义成员的快速方法是用于..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;
}
函数mystringiyarray(a){
var s=[];
变量re=/^\d+$/;

对于(var i=0,iLen=a.length;iIs)您需要索引3333而不是0作为开始的原因是什么?也许您应该重新考虑您的索引。您希望stringify返回什么?您误用了数组数据结构。这里最好使用一个对象并调用相关的数组原型方法。“有没有办法让javascript不这样做?…”您希望它做什么?在字符串化时是否可以使用数组的过滤版本?例如,
JSON.stringify(arr.filter(函数(i,v){return typeof v!=“undefined”}))
特殊版本可以只使用省略,这在数组文本中是有效的,不会创建“缺少”的成员,上面的
0、、、、、4、、6、7、、9
,这并不奇怪是
Array.prototype.toString
返回的内容。@RobG:不错,我不知道它对数组有广泛的支持。例如IE中的对象不支持它。
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;
}