Javascript - 重新索引数组

bor*_*ris 15 javascript arrays serialization

是我的例子.你能告诉我怎样才能让数组有连续的键

array[0]
array[1]
array[2]
Run Code Online (Sandbox Code Playgroud)

当我有

var testArray = new Array();
testArray[3]="qwerty";
testArray[7]="asdfgh";
testArray[13]="zxcvbn";
var testString = testArray.join();
Run Code Online (Sandbox Code Playgroud)

编者注:提问者想要重新索引他的数组.

Red*_*dro 32

Array.prototype.filter()不会对已删除或以前未定义的项目执行.所以你可以简单地做:

testArray.filter(function(val){return val});
Run Code Online (Sandbox Code Playgroud)

..为了重新索引你的数组.

或ES6:

testArray.filter(val => val)
Run Code Online (Sandbox Code Playgroud)

  • 请注意,它将返回一个新数组,而不会影响`testArray`.你可能想要重新定义它:`testArray = testArray.filter(val => val);` (4认同)

Exe*_*ian 9

如果您不介意使用javascript 1.6 :(注意:此代码使用jQUery库)

var testArray = new Array();
testArray[3]="qwerty";
testArray[7]="asdfgh";
testArray[13]="zxcvbn";
var testString = testArray.filter(function (item) { return item != undefined }).join();

$(function(){
    $('#write').text(testString);
});
Run Code Online (Sandbox Code Playgroud)

过滤器原型:

if (!Array.prototype.filter)
{
  Array.prototype.filter = function(fun /*, thisp */)
  {
    "use strict";

    if (this === void 0 || this === null)
      throw new TypeError();

    var t = Object(this);
    var len = t.length >>> 0;
    if (typeof fun !== "function")
      throw new TypeError();

    var res = [];
    var thisp = arguments[1];
    for (var i = 0; i < len; i++)
    {
      if (i in t)
      {
        var val = t[i]; // in case fun mutates this
        if (fun.call(thisp, val, i, t))
          res.push(val);
      }
    }

    return res;
  };
}
Run Code Online (Sandbox Code Playgroud)


Arr*_*ron 5

超级简单的功能:

function reindex_array_keys(array, start){
    var temp = [];
    start = typeof start == 'undefined' ? 0 : start;
    start = typeof start != 'number' ? 0 : start;
    for(var i in array){
        temp[start++] = array[i];
    }
    return temp;
}
testArray = reindex_array_keys(testArray);
Run Code Online (Sandbox Code Playgroud)

注意:这将吹走任何自定义键。结果将始终以数字索引。您可以添加检查它是否是数组,但我倾向于不使用我构建的函数,而不是打算使用的函数。如果您愿意,也可以将索引设置得更高:

testArray = reindex_array_keys(testArray, 3);
Run Code Online (Sandbox Code Playgroud)

这将在数​​组的开头产生 3 个“未定义”项。你可以稍后再添加它,但我认为最好先做testArray.unshift('newValue')然后亲自重新索引。

玩得开心


Nin*_*olz 5

您可以使用返回true或其他真实值的回调来过滤数组,因为Array#filter省略了稀疏元素。

如果Boolean采用,结果不仅会过滤稀疏项,还会过滤具有虚假值的项。为了防止这种情况,采取一个true为每个元素返回的回调。

array.filter(_ => true);
Run Code Online (Sandbox Code Playgroud)

array.filter(_ => true);
Run Code Online (Sandbox Code Playgroud)