动态更改属性名称

时间:2017-03-08 07:45:40

标签: javascript angularjs arrays object

我有一个像这样的对象

var taskText = {
    0: "t1",
    1: "t2",
    2: "t3",
    3: "t4"
}

我要使用1这样删除delete属性

delete vm.taskItem[1]

现在结果就像这样

{
    0: "t1",
    2: "t3",
    3: "t4"
}

我的问题是,有什么方法可以将下一个属性名称还原为删除的属性名称,依此类推。我需要的是像这样的对象

{
    0: "t1",
    1: "t3",
    2: "t4"
} 

4 个答案:

答案 0 :(得分:3)

您可以迭代已排序的键并将值分配给递减的键,然后删除最后一个键。

function deleteKey(object, key) {
    var keys = Object.keys(object).sort(function (a, b) {
            return a - b;
        });

    keys.forEach(function (k) {
        if (k > key) {
            object[k - 1] = object[k];
        }
    });
    delete object[keys.pop()];
}

var taskText = { 0: "t1", 1: "t2", 2: "t3", 3: "t4" };

deleteKey(taskText, 1);
console.log(taskText);

答案 1 :(得分:2)

你可以使用Underscore.js或Lodash,有一个功能'省略'那会做的。 click here for documentation

var taskText = {
                 'a': "t1",
                 'b': "t2",
                 'c': "t3",
                 'd': "t4"
               }
_.omit(taskText ,'b'); //It will return a new object

=> {'a' : 't1', 'c' : 't3', 'd' : 't4'}  //result

答案 2 :(得分:1)



var taskText = {
    0: "t1",
    1: "t2",
    2: "t3",
    3: "t4"
}

Object.prototype.deleteByKey = function(key) {
var i = 0;	
for(var k in this) {
 if (k != key) {
  this[i] = this[k];
  i++;
 }
}
};

taskText.deleteByKey(1);

console.log(taskText);




答案 3 :(得分:0)

我认为你使用JavaScript数组会更好。

使用JavaScript数组,删除任何元素将自动更改其他元素的索引,而无需您执行任何操作。此外,添加元素将处理这种情况。由于你的密钥是普通数字,我认为数组是一个更好的解决方案。