在lodash中合并嵌套对象

时间:2018-05-15 11:48:18

标签: arrays node.js lodash

我有一个嵌套的Object :(表单示例)

int[] decodedCodes = DecodeCharCode(decodingText.Text);
const result = { '1':
   { 'a':
      [ { id: '1',
          sndid: 'a',
          type: 'ios',
          value: '55',
          weight: 2
        },
        { id: '1',
          sndid: 'a',
          sumvalue: 2 },
        { id: '1',
          sndid: 'a'},
        { id: '1',
          sndid: 'a',
          calcsum: '3' } ],
     '2':
      [ { id: '1',
          sndid: 'b',
          type: 'ios',
          value: '55',
          weight: 3
         },
        { id: '1',
          sndid: 'b',
          sumvalue: 3 },
        { id: '1',
          sndid: 'b'},
        { id: '1',
          sndid: 'b',
          calcsum: '7' } ] },
  '3':
   { 'a':
      [ { id: '3',
          sndid: 'a',
          type: 'ios',
          value: '55',
          weight: 23},
        { id: '3',
          sndid: 'a',
          sumvalue: 4 },
        { id: '3',
          sndid: 'a',
          sumvalue_old: '4' },
        { id: '3',
          sndid: 'a',
          calcsum: '5' } ] },    
}

const assignedobject = {};

 _.forEach(result, (values) => {
    _.forEach(values, (vals) => {
      _.forEach(vals, (val) => {
      _.assign(assignedobject, val);
      });
    });
  });

console.log(assignedobject)

使用此对象中的值,我想计算多个值。在此之前,我想将此Object转换为(更易读)对象。

每个“id”都有多个“sndid”。所以我想通过“id”“sndid”对对象进行分组。

(例如,转换后的Object应具有此结构)

<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

我尝试循环进入所有嵌套对象并将其分配给新对象。但他只是将最后一个循环推入我的对象。代码看起来也很糟糕。

结果与示例相似,但他只占用最后一个对象。

1 个答案:

答案 0 :(得分:0)

递归flatMap变体:

&#13;
&#13;
const result = { '1':
   { 'a':
      [ { id: '1',
          sndid: 'a',
          type: 'ios',
          value: '55',
          weight: 2
        },
        { id: '1',
          sndid: 'a',
          sumvalue: 2 },
        { id: '1',
          sndid: 'a'},
        { id: '1',
          sndid: 'a',
          calcsum: '3' } ],
     '2':
      [ { id: '1',
          sndid: 'b',
          type: 'ios',
          value: '55',
          weight: 3
         },
        { id: '1',
          sndid: 'b',
          sumvalue: 3 },
        { id: '1',
          sndid: 'b'},
        { id: '1',
          sndid: 'b',
          calcsum: '7' } ] },
  '3':
   { 'a':
      [ { id: '3',
          sndid: 'a',
          type: 'ios',
          value: '55',
          weight: 23},
        { id: '3',
          sndid: 'a',
          sumvalue: 4 },
        { id: '3',
          sndid: 'a',
          sumvalue_old: '4' },
        { id: '3',
          sndid: 'a',
          calcsum: '5' } ] },    
}

const extractSndid = item => {
    if (_.isArray(item)) {
        return _.map(item, i => _.assign(...i));
    }
    return extractSndid(_.values(item))
}

const assignedobject = _.flatMap(result, extractSndid);

console.log(assignedobject)
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>
&#13;
&#13;
&#13;