пытаясь удалить вложенный объект с помощью lodash - PullRequest
0 голосов
/ 11 апреля 2020

Я не уверен, что делаю неправильно, но не могу сбросить. Я пытаюсь удалить элемент из объекта в редуксе. пытался использовать удаление, но это ломает приложение. я получаю истинный ответ от loda sh, что он был удален, но когда я утешаю его после того, как он показывает тот же объект.

let newState = {...state};
console.log('before', newState);
console.log(_.unset(newState, [`year2020.month${action.month}.days.day${action.day}`]));
console.log('after',newState);
return newState;

пример состояния:

let state = {
  year2020: {
    month3: {
      num: 0,
      name: "January",
      length: 31,
      starts: 3,
      days: {
        day1: { mood: 1 },
        day2: { mood: 2 },
        day3: { mood: 3 },
        day11: { mood: 4 }
      }
    }
  }
};

1 Ответ

1 голос
/ 11 апреля 2020

Поскольку ваш путь - строка (одна строка, разделенная точками), не переносите в массив.

Примечание: используйте _.cloneDeep() вместо мелкого клона (спреда), поскольку вы мутируете более глубокие уровни объекта:

const state = {"year2020":{"month3":{"num":0,"name":"January","length":31,"starts":3,"days":{"day1":{"mood":1},"day2":{"mood":2},"day3":{"mood":3},"day11":{"mood":4}}}}};

const newState = _.cloneDeep(state);
const action = { payload: { month: 3, day: 1 }};
_.unset(newState, `year2020.month${action.payload.month}.days.day${action.payload.day}`);
console.log('after',newState);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

Lodash / fp прекрасно работает с redux, поскольку он не изменяет исходный объект (в этом примере путь является массивом):

const state = {"year2020":{"month3":{"num":0,"name":"January","length":31,"starts":3,"days":{"day1":{"mood":1},"day2":{"mood":2},"day3":{"mood":3},"day11":{"mood":4}}}}};

const action = { payload: { month: 3, day: 1 }};

const newState = _.unset([
  'year2020',
  `month${action.payload.month}`,
  'days',
  `day${action.payload.day}`
], state);

console.log('after',newState);
<script src='https://cdn.jsdelivr.net/g/lodash@4(lodash.min.js+lodash.fp.min.js)'></script>
...