Adding to a Javascript object without replacing a child

I am trying to run a for loop to create new javascript objects and add javascript to an existing javascript object without replacement.

For example, I'm trying to create this as an output without overwriting each group [i] (and just adding the data of the number [i]):

{
    "group1": {
        "number1": "data",
        "number2": "data",
        "number3": "data"
    },
    "group2": {
        "number1": "data",
        "number2": "data"
    }
}

My loop looks like this:

var array = [{
    "groupName": "group1",
    "number": "number1",
    "data": "data"
}, {
    "groupName": "group1",
    "number": "number2",
    "data": "data"
}, {
    "groupName": "group1",
    "number": "number3",
    "data": "data"
}, {
    "groupName": "group2",
    "number": "number1",
    "data": "data"
}, {
    "groupName": "group2",
    "number": "number2",
    "data": "data"
}]

var groupLinks = {};

for(i = 0; i < array.length; i++) {

    groupLinks[array[i].groupName] = { 
        [array[i].number]: array[i].data

}

As you can see with this code, my loop will only replace "group1" and "group2" each time.

+4
source share
4 answers

Here's how I was going to get close to this:

var array = [{
    "groupName": "group1",
    "number": "number1",
    "data": "data"
}, {
    "groupName": "group1",
    "number": "number2",
    "data": "data"
}, {
    "groupName": "group1",
    "number": "number3",
    "data": "data"
}, {
    "groupName": "group2",
    "number": "number1",
    "data": "data"
}, {
    "groupName": "group2",
    "number": "number2",
    "data": "data"
}];

var groupLinks = {};

array.forEach(
    function (element)
    {
        var groupName = element.groupName;
        (groupLinks[groupName] = groupLinks[groupName] || {})
            [element.number] = element.data;

    }
);

console.log(groupLinks);
Run code

|| , , groupLinks[groupName] , forEach .

+5

:

    var array = [{
        "groupName": "group1",
        "number": "number1",
        "data": "data"
    }, {
        "groupName": "group1",
        "number": "number2",
        "data": "data"
    }, {
        "groupName": "group1",
        "number": "number3",
        "data": "data"
    }, {
        "groupName": "group2",
        "number": "number1",
        "data": "data"
    }, {
        "groupName": "group2",
        "number": "number2",
        "data": "data"
    }]

    var groupLinks = {};

    array.forEach(function(el){
       if(groupLinks[el.groupName]){
         groupLinks[el.groupName][el.number] = el.data
       }
       else{
         groupLinks[el.groupName] = {};
         groupLinks[el.groupName][el.number] = el.data
       }

    });

   console.log(groupLinks);
0

If you're not afraid of a bit of ES2015, this job cut should work for you.

let array = [{"groupName":"group1","number":"number1","data":"data"},{"groupName":"group1","number":"number2","data":"data"},{"groupName":"group1","number":"number3","data":"data"},{"groupName":"group2","number":"number1","data":"data"},{"groupName":"group2","number":"number2","data":"data"}];

let groupLinks = array.reduce((gl, group) => {
    gl[group.groupName] = Object.assign({
        [group.number]: group.data
    }, gl[group.groupName]);
    return gl;
}, Object.create(null));

console.log(groupLinks);
Run code
0
source

Please try the following:

    var groupLinks = {};

    for(i = 0; i < array.length; i++) {
       var groupLinks2 = groupLinks[array[i].groupName];
       if(!groupLinks2){
           groupLinks2 ={};
           var a = array[i].number;
           groupLinks2[a] = array[i].data;
      }else{
         var a = array[i].number;
        groupLinks2[a] = array[i].data;
      }
      groupLinks[array[i].groupName] = groupLinks2;

   }
0
source

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


All Articles