简体   繁体   English

在不替换子项的情况下添加到Javascript对象

[英]Adding to Javascript Object Without Replacing Child

I am trying to run a for loop to create new javascript objects and add to an existing javascript object without replacing. 我正在尝试运行for循环来创建新的javascript对象并添加到现有的javascript对象而不替换。

For example I am trying to create this as the output without the group[i] being overwritten every time ( and just adding the number[i] data ): 例如,我试图创建它作为输出,而不是每次都覆盖组[i](并且只添加数字[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 is only going to replace "group1" and "group2" every time. 正如您在此代码中看到的那样,我的循环每次只会替换“group1”和“group2”。

This is how I would go about approaching 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); 

here I used the || 在这里我使用了|| operator to create a new group when none was present, overwriting the existing groupLinks[groupName] at each iteration, and I used a forEach construct to loop over array elements. 运算符在不存在时创建新组,在每次迭代时覆盖现有的groupLinks[groupName] ,并使用forEach构造循环数组元素。

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

If you're not afraid of a little ES2015, this reduce job should work for you 如果你不害怕ES2015,这个减少工作应该适合你

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

Please try this: 请试试这个:

    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;

   }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM