обновление глубоко вложенного объекта в коллекции - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть структура, подобная приведенной ниже -

var a = {
  foo: {
    dates: {'2018-11-29': 2020.55},
    strategies: [
      {
        expiryDate: '2018-11-29',
        projects: [
          {
            expiryDate: '2018-11-29',
            name: 'foo',
            value: 500
          }
        ]
      }
    ]
  },
  bar: {
    dates: {'2018-11-29': 2020.55},
    strategies: [
      {
        expiryDate: '2018-11-29',
        projects: [
          {
            expiryDate: '2018-11-22',
            name: 'bar',
            value: 650
          },
          {
            expiryDate: '2018-11-22',
            name: 'mario',
            value: 700
          }
        ]
      }
    ]
  }
}

Я пытаюсь найти способ легко обновлять внутреннюю коллекцию projects с помощью lodash.Но я получаю ошибку

Я пытаюсь сделать что-то вроде этого

const finalTransformedData = _.mapValues(
  a,
  (value, key) => {
    value.strategies.map(strats =>
      strats.projects.map(trade =>
        Object.assign(
          {},
          { trade: 1 },
        ),
      ),
    );
  },
);

, но я получаю вывод ниже - где я ошибаюсь?

{ foo: undefined, bar: undefined }

Приведенный выше пример кода немного упрощен, но мне нужно как-то легко манипулировать объектами в массиве проектов - по сути, получить что-то вроде этого - заменить объект в массиве, просматривая его и назначаяновый объект (полученный из object.assign)

foo: {
    dates: {'2018-11-29': 2020.55},
    strategies: [
      {
        expiryDate: '2018-11-29',
        projects: [
          {
            trade: 1
          }
        ]
      }
    ]
  },
  bar: {
    dates: {'2018-11-29': 2020.55},
    strategies: [
      {
        expiryDate: '2018-11-29',
        projects: [
          {
            trade: 1
          },
          {
            trade: 1
          }
        ]
      }
    ]
  }

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Не используйте lodash для этого.Вместо этого используйте immer - https://github.com/mweststrate/immer

Вы бы сделали это так:

const finalTransformedData = produce(
  a,
  (draft) =>
    draft.strategies.forEach(strats =>
      strats.projects.forEach(project => {
        project.trade = 1
      })
    ),
);
0 голосов
/ 22 ноября 2018

Без lodash вы также можете попробовать циклы for..of

var a = {  foo: {    dates: {'2018-11-29': 2020.55},    strategies: [      {        expiryDate: '2018-11-29',        projects: [          {            expiryDate: '2018-11-29',            name: 'foo',            value: 500          }        ]      }    ]  },  bar: {    dates: {'2018-11-29': 2020.55},    strategies: [      {        expiryDate: '2018-11-29',        projects: [          {            expiryDate: '2018-11-22',            name: 'bar',            value: 650          },          {            expiryDate: '2018-11-22',            name: 'mario',            value: 700          }        ]      }    ]  }}

for(let { strategies } of Object.values(a)) {
  for(let s of strategies) {
    s.projects = s.projects.map(d => ({ trade: 1 }))
  }
}

console.log(a)
...