2017-04-20 61 views
1

我想向数组添加值。但相同的值可能会更新。例如我的数组是javascript更新或向数组添加值

[{"abc1":"123456"},{"abc2":"123456"}] 

何时再次添加的是abc1。它可能会更新。例如,在正常情况下

[{"abc1":"123456"},{"abc2":"123456"},{"abc1":"123456"}] 

但我想

[{"abc2":"123456"},{"abc1":"123456"}] 

我的代码

var categories = [], 
arrIndex = {}; 

addOrReplace({"abc1":"125"}); 
addOrReplace({"abc2":"126"}); 
addOrReplace({"abc1":"127"}); 
addOrReplace({"abc3":"129"}); 


function addOrReplace(object) { 
    var index = arrIndex[object[0]]; 
    console.log("index:"+object[0]); 
    if(index === undefined) { 
     index = categories.length; 
    } 
    arrIndex[object[1]] = index; 
    categories[index] = object; 
} 

console.log(categories); 

它没有表现出正确的答案。 它显示

[{"abc3":"129"}] 

我想

[{"abc2":"126"},{"abc1":"127"},{"abc3":"129"}] 

怎么可能呢?请帮帮我?

+1

所以,如果我理解正确的话,如果存在键为'abc1'的对象,请删除它并推送新值。我对吗? – Rajesh

+2

如果阵列中的对象只有一个键,我会建议有对象而不是数组。值将覆盖在对象 – Rayon

+0

@Rajesh是的,你是对的。 – joe

回答

2

如果找到索引,则可以使用Array#findIndex从类别中剪切对象,然后将新对象推送到categories

function addOrReplace(object) { 
 
    var key = Object.keys(object)[0], 
 
     index = categories.findIndex(o => key in o); 
 

 
    if (index !== -1) { 
 
     categories.splice(index, 1); 
 
    } 
 
    categories.push(object) 
 
} 
 

 
var categories = []; 
 

 
addOrReplace({ abc1: "125"}); 
 
console.log(categories); 
 
addOrReplace({ abc2: "126"}); 
 
console.log(categories); 
 
addOrReplace({ abc1: "127"}); 
 
console.log(categories); 
 
addOrReplace({ abc3: "129"}); 
 
console.log(categories);
.as-console-wrapper { max-height: 100% !important; top: 0; }

1
var categories = new Map(); 

    addOrReplace({"abc1":"125"}); 
    addOrReplace({"abc2":"126"}); 
    addOrReplace({"abc1":"127"}); 
    addOrReplace({"abc3":"129"}); 


    function addOrReplace(object) { 
     for (var name in object) 
      categories[name] = object; 
    } 

    console.log(categories); 
0
var categories = [], 
arrIndex = {}; 

addOrReplace({"abc1":"125"}); 
addOrReplace({"abc2":"126"}); 
addOrReplace({"abc1":"127"}); 
addOrReplace({"abc3":"129"}); 


function addOrReplace(object) { 
    for(var c in categories){ 
     if(Object.keys(categories[c])[0] == Object.keys(object)[0]){ 
      categories.splice(c,1) 
     } 
    } 
    categories.push(object) 
} 

console.log(categories); 
//[{"abc2":"126"},{"abc1":"127"},{"abc3":"129"}] 
0

我不知道你将如何使用最终的最终数据,但如果你正在寻找的独特性是,我想推荐去为object hash而不是数组。

最初:

{ 
    "abc1" : "123456", 
    "abc2" : "123456" 
} 

如果你现在添加{ "abc1" : "some_other_value" }

{ 
    "abc1" : "some_other_value", 
    "abc2" : "123456" 
} 

您还可以检查是否存在价值已经或者不使用if(objectHash('abc1'))

它可以节省您的额外遍历,并会覆盖值,如果已经存在。