0

If I have an object like this:

var myObj = [

    {'name': 'Mike', 'number' : 'b1' , 'level' : 0 },
    {'name': 'Tom',  'number' : 'b2' , 'level' : 0 }
];

How can I create three separate objects like:

"names" : 
{
  'name1' : 'Mike',
  'name2' : 'Tom',
..}

"numbers" :
{
  'number1' : 'b1',
  'number2' : 'b2',
..}

"levels" :
{
  'level1' : '0',
  'level2' : '0',
...
}
George
  • 5,808
  • 15
  • 83
  • 160
  • same property multiple times, only last one will be survive :D ... `{'name' : 'Mike', 'name' : 'Tom'}` => `{name: 'Tom'}` – Pranav C Balan Jun 11 '16 at 08:07
  • Well keys in a js object need to be unique so when names , numbers 7 levels have same key as property that may not ve a valid object. You can take a look at http://stackoverflow.com/questions/3996135/js-associative-array-with-duplicate-names http://stackoverflow.com/questions/17063257/necessity-for-duplicate-keys-in-json-object – brk Jun 11 '16 at 08:14

3 Answers3

1

You could use the keys and the number of the element iteration as property.

var myObj = [{ 'name': 'Mike', 'number': 'b1', 'level': 0 }, { 'name': 'Tom', 'number': 'b2', 'level': 0 }],
    result = {};

myObj.forEach(function (a, i) {
    Object.keys(a).forEach(function (k) {
        result[k + 's'] = result[k + 's'] || {};
        result[k + 's'][k + (i + 1)] = a[k];
    });
});

console.log(result);
Nina Scholz
  • 376,160
  • 25
  • 347
  • 392
  • :Thanks!I chose the other answer because it was more flexible.I could use `obj.numbers` for example. (upvoted) – George Jun 11 '16 at 13:38
1

The alternative solution using Object.keys function, ES6 arrow function expression and predefined parts object:

var myObj = [{'name': 'Mike', 'number': 'b1', 'level': 0},{'name': 'Tom', 'number': 'b2', 'level': 0}],
    parts = {'names': {}, 'numbers': {}, 'levels': {}};

myObj.forEach(function(obj, i){
    Object.keys(obj).forEach((k) => (parts[k +"s"][k +(i+1)] = obj[k]));
});

console.log(JSON.stringify(parts, 0, 4));

The output:

{
    "names": {
        "name1": "Mike",
        "name2": "Tom"
    },
    "numbers": {
        "number1": "b1",
        "number2": "b2"
    },
    "levels": {
        "level1": 0,
        "level2": 0
    }
}
RomanPerekhrest
  • 88,541
  • 4
  • 65
  • 105
  • :Hello , I opened [this](http://stackoverflow.com/questions/37989760/remove-keys-that-start-with-specific-letter),if you are interested.Thanks! – George Jun 23 '16 at 11:03
  • @George, hello, there's an answer from user @ gurvinder372. Did it help you? – RomanPerekhrest Jun 23 '16 at 11:13
  • :Hi and than you very much for your interest.I saw that he updated.Now , only an issue remains to remove the brackets from the result.If he answers that , I am ok .Thanks! – George Jun 23 '16 at 11:18
0

Keys in JS objects must be unique.

The subsequent declaration of name : Tom overwrites your previous one.

Code :

var newObj = {};
newObj.names = {};
newObj.numbers = {};
newObj.levels = {};

for (var i in myObj) {
newObj.names.name = myObj[i].name;
newObj.numbers.number = myObj[i].number;
newObj.levels.level = myObj[i].level;
}

console.log(newObj);

Demo fiddle : https://jsfiddle.net/29pb33dj/

Updated answer with proper keys with index :

var newObj = {};
newObj.names = {};
newObj.numbers = {};
newObj.levels = {};

for (var i in myObj) {
newObj.names[i] = myObj[i].name;
newObj.numbers[i] = myObj[i].number;
newObj.levels[i] = myObj[i].level;
}

console.log(newObj);

Working demo : https://jsfiddle.net/29pb33dj/1/

Debug Diva
  • 26,058
  • 13
  • 70
  • 123