2017-04-20 9 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); 

をしたいです。 それは私が

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

どのようにそれを可能にしたいですか?

[{"abc3":"129"}] 

を示し私を助けてください?

+1

もし私が正しく理解すれば、キー 'abc1'を持つオブジェクトがあればそれを削除し、新しい値を押します。私は正しい? – Rajesh

+2

配列内のオブジェクトにキーが1つしかない場合は、配列よりobjectを持つことをお勧めします。値はオブジェクト – Rayon

+0

に上書きされます@Rajeshはいそうです。 – joe

答えて

2

インデックスが見つかった場合はArray#findIndex anspliceオブジェクトを使用して、新しいオブジェクトを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'))を使用して、すでに存在していないか、場合にも確認することができます。

これは余分なトラバーサルからあなたを救うことができ、すでに存在する場合は値を上書きします。

関連する問題