如何修改包含相同名称值的对象数组?

时间:2015-10-08 02:31:00

标签: javascript arrays object

给定以下嵌套对象数组:

    var existingArray = [{
            "content": {
                "host": {
                    "name": "Mia"
                }
            },
        }, {
            "content": {
                "host": {
                    "name": "Annie"
                }
            },
        }, {
            "content": {
                "host": {
                    "name": "Mia"
                }
            },
            ,
            {
                content: {
                    host: {
                        name: "Oscar"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Annie"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Mia"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Annie"
                    }
                },
            }
        ];

如果对象的名称值匹配,我该如何修改它? - 区分它们?

生成新数组,例如:

        var existingArray = [{
            "content": {
                "host": {
                    "name": "Mia"
                }
            },
        }, {
            "content": {
                "host": {
                    "name": "Annie"
                }
            },
        }, {
            "content": {
                "host": {
                    "name": "Mia_2"
                }
            },
            ,
            {
                content: {
                    host: {
                        name: "Oscar"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Annie_2"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Mia_3"
                    }
                },
            },
            {
                "content": {
                    "host": {
                        "name": "Annie_3"
                    }
                },
            }
        ];

我需要保持数组的结构几乎相同 - 只需更新重复的名称值。

我需要这个的原因是因为我使用了一个插件来检查重复的名称,然后将它们组合起来(这些内容的原因或原因太复杂,无法在此处发布。)

2 个答案:

答案 0 :(得分:1)

这样的事可能适合你:

var i;
var k;
for(i = 0; i < existingArray.length; i++){
    var count = 2;
    for(k = 0; k < existingArray.length; k ++){
        if(i != k && existingArray[i].content.host.name === existingArray[k].content.host.name){
            existingArray[k].content.host.name += '_' + count;
            count++;
        }
    }
}

答案 1 :(得分:0)

保留一个对象,其中每个名称都用作键,并将其用作值。

然后在每次迭代中引用它以查看名称是否已被使用。

如果尚未使用它,请将其添加到阵列并将其设置为1.在这种情况下,名称将保持不变。

如果已经使用过,请在数组中增加它的值。在这种情况下,名称将加上'_'加上使用name作为键存储在对象中的值。

var existingArray = [  
   {  
      "content":{  
         "host":{  
            "name":"Mia"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Annie"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Mia"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Oscar"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Annie"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Mia"
         }
      }
   },
   {  
      "content":{  
         "host":{  
            "name":"Annie"
         }
      }
   }
]
,   usedNames = {}
,   newArray = []
,   result = ''
;
for(var index = 0; index < existingArray.length; index ++) {
    var name = existingArray[index]['content']['host']['name'];
    newArray.push(existingArray[index]);
    if(typeof usedNames[name] !== 'number') {
        usedNames[name] = 1;
        newArray[index]['content']['host']['name'] = name;
    } else {
        usedNames[name] ++;
        newArray[index]['content']['host']['name'] = name + '_' + usedNames[name];
    }
    result += 'content: host: name: ' + newArray[index]['content']['host']['name'] + '<br/>';
}
document.write(result);