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

4

给出以下对象数组:

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

我该如何修改具有相同键的对象keys?这样我就可以得到一个新的数组,如下所示:
p =[
{
    "object1_1": "value",
},
{
    "object2": "value",
},
{
    "object1_2": "value",
},
{
    "object3_1": "value",
},
{
    "object4": "value",
},
{
    "object1_3": "value",
},
{
    "object3_2": "value",
}
];

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


我看不出修改中的客户端?您可以逐个删除过时的对象和新对象或对其进行修改。 - Lucio
你如何确保重复项始终具有特定顺序(如果这很重要)? - Tim Biegeleisen
这个问题太难解释为什么我需要它。还有其他因素——太复杂了,不方便详细说明。 - webbydevy
@TimBiegeleisen 顺序无关紧要。感谢您的快速回复。 - webbydevy
您可以遍历元素并通过替换键名来更改重复项。只需在找到相同元素时保持计数器即可。这可以用不同的方法完成,但成本会有所不同。 - Eissa
显示剩余2条评论
2个回答

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
});

编辑:

当然下面提出了一些好的观点,不要使用名称“set”。另外你可以通过添加一个if语句来避免第一个元素使用“_1”,像这样:

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

只在重复元素上添加'_1'的做法,你可以再次遍历并使用最终计数。

小心变量set,因为对象描述符中的getset,有些环境会将其视为关键字。 - Patrick Roberts
这非常接近了,你只需要不要在不重复的元素上添加“_1”。 - Spencer Wieczorek
是的,非常接近了。http://jsfiddle.net/ansible/sgbkyrc4/ 我会试着去操作一下,看看能否让它工作 - 根据@SpencerWieczorek的评论。 - webbydevy
最新的编辑已完成。我更新了http://jsfiddle.net/ansible/sgbkyrc4。谢谢! - webbydevy

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);

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接