How to change an array of objects containing keys with the same name?

The following array of objects is specified:

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

How do I change key objects using the same key?

So, I have a new array like:

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

I need the array structure to be almost identical - only with duplicate key updates.

+4
source share
2 answers

You can count the number of times each key value appears, creating a new object to track the existence of each key.

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

EDIT:

Of course, some of the good points below do not use a set of names. also you could escape the "_1" for the first element by adding an if statement, for example:

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

"_1" , , .

+3

, , , , , .

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

, .

0

Source: https://habr.com/ru/post/1610671/


All Articles