объединять вложенные объекты в lodash - PullRequest
0 голосов
/ 15 мая 2018

У меня есть вложенный объект: (Пример формы)

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" .

(Например, преобразованный Объект должен иметь эту структуру)

  { 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}

Я попытался зациклить все вложенные объекты и назначить его новому объекту.Но он просто вставил последний цикл в мой объект.Также код выглядит плохо.

Результат похож на приведенный выше пример, но он берет только последний объект.

1 Ответ

0 голосов
/ 16 мая 2018

Рекурсивный 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>
...