Используйте loda sh или es6, чтобы написать функцию, которая принимает объект с глубоко вложенными свойствами и возвращает новый объект только с выбранными свойствами - PullRequest
0 голосов
/ 17 марта 2020

У меня есть объект, который имеет много ненужных свойств и свойств с глубоким вложением, которые я хочу.

Моя цель - взять этот первый объект и вернуть новый объект только с теми полями, которые мне нужны.

Вот пример большого и большого объекта и пример того, как я пытаюсь изменить его форму:

let bigObject = {
  id: 1,
  a: 'a',
  b: 'b',
  c: 'c',
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      dontNeedThisProperty: 'blah',
      a2: 'a',
      rejection: 'vLine rejection reason 1',
      dLines: [
        {
          id: 1,
          rejection: 'dline rejection reason 1',
          amount: 12345,
          vouchLineId: 1
        }
      ]
    },
  ]
}

Я хочу обрезать его так, чтобы он выглядел так:

let newObject = {
  id: 1,
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      rejection: 'vLine rejection reason 1'
    }
  ],
  dLines: [
    {
      id: 1,
      rejection: 'dline rejection reason 1',
      vouchLineId: 1
    }
  ]
}

У меня есть селектор-редуктор, который частично помогает мне, но у меня возникают проблемы с доступом к этим глубоко вложенным свойствам для dLine

import { createSelector } from 'reselect';
import { isEqual, pick } from 'lodash';

export const testSelector = createSelector(
  nestedSelectedSelector,
  vouch => pick(vouch, ['id', 'vLines'])
);

1 Ответ

2 голосов
/ 18 марта 2020

Это не красиво и не чисто, но это дает результат, который вы ожидаете. Вероятно, есть более эффективный способ сделать flatMap() функцию на dLines, чтобы вам не пришлось делать еще один map() впоследствии, но это был мой быстрый и грязный способ сделать это.

let bigObject = {
  id: 1,
  a: 'a',
  b: 'b',
  c: 'c',
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      dontNeedThisProperty: 'blah',
      a2: 'a',
      rejection: 'vLine rejection reason 1',
      dLines: [
        {
          id: 1,
          rejection: 'dline rejection reason 1',
          amount: 12345,
          vouchLineId: 1
        }
      ]
    },
  ]
};

// How you said you wanted it to look...
/*
let newObject = {
  id: 1,
  vLines: [
    {
      vouchId: 1,
      vouchLineId: 1,
      rejection: 'vLine rejection reason 1'
    }
  ],
  dLines: [
    {
      id: 1,
      rejection: 'dline rejection reason 1',
      vouchLineId: 1
    }
  ]
}*/

const newObject = _.chain(bigObject)
  .pick(['id'])
  .set('vLines', _.chain(bigObject.vLines).map(vLine => _.pick(vLine, ['vouchId', 'vouchLineId', 'rejection'])).value())
  .set('dLines', _.chain(bigObject.vLines).flatMap('dLines').map(dLine => _.pick(dLine, ['id', 'vouchLineId', 'rejection'])).value())
  .value();
  
console.log(newObject)
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.min.js"></script>
...