在Javascript中重新索引对象数组(无拼接)

时间:2015-02-18 11:30:43

标签: javascript arrays sorting

我应该如何索引对象数组?

假设我有这种结构:

var list = [
    { index : 1, text : "aaa" },
    { index : 2, text : "bbb" },
    { index : 3, text : "ccc" }
];

我想删除第二个。重新索引此数组的最佳方法是什么?

如果删除多个元素会怎样?

我不能只使用拼接的原因是因为这个数组是由几个实例化的对象构建的。因此,数组是指向另一个对象中的键的对象列表。

编辑:我正在使用FabricJS对象。假设我在画布上有三个FabricJS文本对象,每个文本对象都有一个自定义属性,可以在列表中显示它的位置。

因此,如果删除一个文本对象,我必须更新其他文本对象。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用.filter()

var index_to_delete = 2; //just example..
list = list.filter(function (item) {
  return item.index !== index_to_delete;
});

然后如果要重建索引,可以使用.map()

list = list.map(function (item, index) {
   item.index = index;
   return item;
});

或者您可以使用.reduce()一次性执行上述操作..

list = list.reduce(function (accum, item, index) {
  if (item.index !== index_to_delete) {
    item.index = index;
    accum.push(item);
  }
  return accum;
}, []);

答案 1 :(得分:0)

根据你的问题并认为问题是数据结构可能不是最好的,我会用这样的东西:

function removeItem (index /* int */) {
    list = list.splice(index, 1);
    for (var i = index; i < list.length; i++) {
        list[i].index = list[i].index - 1;
    }
}

但是,如果它是从索引1到索引10的有序列表,例如,我将使用数组位置作为索引。如果你的索引有差距(f.i:索引1,索引3,索引6,索引7),你可以使用类似的东西。

答案 2 :(得分:-1)

function deleteElement(list, index) {
    var newList = [];
    for (var ix in list) {
        var el = list[ix];
        if (el.index == index)
            continue;

        if (el.index > index)
            el.index--;

        newList.push(el);
    }
    return newList;
}

编辑:包含一般方法