将对象推送到数组而不重复相同

时间:2015-08-07 10:32:29

标签: javascript arrays

我有一个像这样的数组

var myArray = [{A:[{10:'a'},{11:'b'},{12:'c'}]},{B:[{10:'d'},{11:'e'},{12:'f'}]}]

因此,如果我通过

将follwing对象推送到数组
myArray.push({A:[{10:'k'},{11:'j'},{12:'m'}]});

这应该删除现有的数组元素“A”,因为新的元素也是主要的A,它应该被新元素替换。

所以新对象应该是这样的

var myArray=[{A:[{10:'k'},{11:'j'},{12:'m'}]},{B:[{10:'d'},{11:'e'},{12:'f'}]}]

这意味着推送第一个元素 A 被新的

替换

修改

A,B也是动态的。可能会有更多的插入,如D,E,它们具有相同的子结构。实际上这就是我使用数组的原因。它实际上发生在一个有多个页面的表中。因此,如果同一个元素再次出现在另一个页面中,则应该替换前一个元素。这就是目的

3 个答案:

答案 0 :(得分:3)

只需使用javascript对象,它们基本上就像HashMap一样,如果它们具有相同的键,它们将替换它:

var myJSON = {
    A: [{10:'a'},{11:'b'},{12:'c'}],
    B: [{10:'d'},{11:'e'},{12:'f'}]
};
// will change the existing 'A' object    
myJSON['A'] = [{10:'k'},{11:'j'},{12:'m'}];

// add a new element like this
myJSON['C'] = [{10: 't'}, {11: 'g'}, {12: 'm'}];

答案 1 :(得分:1)

推送数组只会添加一个新值。将整个阵列升级为对象会更好。现在,您可以选择正确的密钥并覆盖其值。

更改为:

var myArray = {A : [{10:'a'},{11:'b'},{12:'c'}],B : [{10:'d'},{11:'e'},{12:'f'}]};

现在你做的时候:

 myJSON['A'] = [{10:'k'},{11:'j'},{12:'m'}];

它会用新值替换A

即使A不存在,也会由此构造创建。

您甚至可以使用Object.keys

对其进行迭代



var myArray = {A : [{10:'a'},{11:'b'},{12:'c'}],B : [{10:'d'},{11:'e'},{12:'f'}]};
var keys = Object.keys(myArray);

for (var i = 0; i < keys.length; i++)
{
  document.body.innerHTML += keys[i] + " : " + myArray[keys[i]].join(", ") + "<br />";  
}
&#13;
&#13;
&#13;

答案 2 :(得分:1)

  1. 查找索引
  2. 如果找到,则用新数据替换元素
  3. 如果没有找到,则将新数据推送到数组的末尾
  4. var myArray = [{ A: [{ 10: 'a' }, { 11: 'b' }, { 12: 'c' }] }, { B: [{ 10: 'd' }, { 11: 'e' }, { 12: 'f' }] }],
        newData = { A: [{ 10: 'k' }, { 11: 'j' }, { 12: 'm' }] };
    
    function update(a, u) {
        var index;
        if (a.some(function (el, i) { return Object.keys(u)[0] in el ? (index = i, true) : false; })) {
            a[index] = u;
        } else {
            a.push(u);
        }
    }
    update(myArray, newData);
    document.getElementById('out').innerHTML = JSON.stringify(myArray, null, 4);
    <pre id="out"></pre>