【问题标题】:merge nested objects in lodash合并lodash中的嵌套对象
【发布时间】:2018-10-25 05:47:50
【问题描述】:

我有一个嵌套对象:(表单示例)

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)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

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

每个 "id" 都有多个 "sndid"。所以我想按 "id""sndid" 对对象进行分组。

(例如转换后的Object应该有这个结构)

  { id: '1',
  sndid: 'a',
  type: 'ios',
  values: '22',
  sumvalue: 8,
  weight: 20,
  calcsum: 2
  },
  { id: '1',
  sndid: 'b',
  type: 'ios',
  values: '22',
  sumvalue: 8,
  weight: 20,
  calcsum: 2
  },
  { id: '2',
  sndid: 'a',
  type: 'ios',
  values: '22',
  sumvalue: 8,
  weight: 20,
  calcsum: 2}

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

结果和上面的例子一样,但他只取了最后一个对象。

【问题讨论】:

    标签: arrays node.js lodash


    【解决方案1】:

    递归flatMap 变体:

    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)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.10/lodash.min.js"></script>

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-22
      • 2019-12-31
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 2017-10-19
      • 2019-12-04
      相关资源
      最近更新 更多