尝试使用lodash删除嵌套对象

时间:2020-04-11 20:06:55

标签: object redux lodash

我不确定我在做什么错,但是我无法取消。我正在尝试从redux中的对象中删除一项。试图使用删除,但它破坏了应用程序。我从lodash得到了一个真实的答复,说它已经被删除了,但是当我在它显示相同对象后进行控制台时。

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 个答案:

答案 0 :(得分:1)

由于您的路径是一个字符串(一个用点分隔的字符串),所以不要包装在数组中。

注意:因为您会突变对象的更深层次,所以请使用_.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>