如何修改包含同名键的对象数组?

时间:2015-10-08 01:19:43

标签: javascript arrays object

给出以下对象数组:

p =[
{
    "object1": "value",
},
{
    "object2": "value",
},
{
    "object1": "value",
},
{
    "object3": "value",
},
{
    "object4": "value",
},
{
    "object1": "value",
},
{
    "object3": "value",
}
];

如何使用相同的密钥修改密钥对象?

所以我有一个像这样的新数组:

p =[
{
    "object1_1": "value",
},
{
    "object2": "value",
},
{
    "object1_2": "value",
},
{
    "object3_1": "value",
},
{
    "object4": "value",
},
{
    "object1_3": "value",
},
{
    "object3_2": "value",
}
];

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

2 个答案:

答案 0 :(得分:3)

您可以通过创建新对象来跟踪每个键的存在来计算每个键值出现的次数。

var set = {};

var changedArray = existingArray.map(function(d){
    // since each object has one key
    var key = Object.keys(d)[0];

    // if the key doesn't exist, add it.  if it does, increment it
    set[key] = (set[key] || 0) + 1

    // create the name
    var name = key + '_' + set[key];
    // create a new object with the given key
    var obj = {};
    obj[name] = d[key]; 
    return obj
});

编辑:

当然,下面提出了一些好处,不要使用名称集。你也可以避免' _1'对于第一个元素,通过添加if语句,如此

var name;
if (set[key] === 1 ) { 
   name = key;
} else {
   name = key + '_' + set[key];
}

至于拥有' _1'只有重复的元素 - 你总是可以使用最终计数再次循环。

答案 1 :(得分:0)

您必须遍历数组两次,一次检查重复哪些键,第二次更换值。



var p = [{
  "object1": "value",
}, {
  "object2": "value",
}, {
  "object1": "value",
}, {
  "object3": "value",
}, {
  "object4": "value",
}, {
  "object1": "value",
}, {
  "object3": "value",
}];

var timesByKeys = {};
var numberByKeys = {};

function workOnEachKey(fn) {
  for (var i = 0; i < p.length; i++) {
    var o = p[i];
    var key = Object.keys(o)[0];
    var timesForKey = timesByKeys[key];
    fn(o, key, timesForKey);
  }
}

workOnEachKey(function(o, key, timesForKey) {
  timesByKeys[key] = timesForKey ? timesForKey + 1 : 1;
  numberByKeys[key] = 0;
});

workOnEachKey(function(o, key, timesForKey) {
  if (timesForKey !== 1) {
    var n = numberByKeys[key] + 1;
    numberByKeys[key] = n;
    o[key + "_" + n] = o[key];
    delete o[key];
  }
});

console.log(p);
&#13;
&#13;
&#13;

运行代码段并检查控制台以查看结果。