如何在不改变的情况下删除嵌套对象状态?

how can I remove a nested object state without mutating?

一种方法是使用 Slice,但它与嵌套对象兼容还是仅适用于数组。如果是这样,我将如何对嵌套对象进行切片?即我的状态是

Object = { 
a:{ 1: '1', 2: '2', 3: '3' }, 
b:{ 1: '1', 2: '2', 3: '3' }, 
c:{ 1: '1', 2: '2', 3: '3' } 
}

并且我想从对象中删除 b。

我能想到的一种方法是使用对象解构:

let obj = { 
    a:{ 1: '1', 2: '2', 3: '3' }, 
    b:{ 1: '1', 2: '2', 3: '3' }, 
    c:{ 1: '1', 2: '2', 3: '3' } 
}

let {a,c} = obj;
let newState = {a,c};

如果你可以使用lodash,我建议使用omit method

那么你将能够做到:

const omit = require('lodash.omit')
const obj = { 
  a:{ 1: '1', 2: '2', 3: '3' }, 
  b:{ 1: '1', 2: '2', 3: '3' }, 
  c:{ 1: '1', 2: '2', 3: '3' } 
}

const objWithoutB = omit(obj, 'b')

或者您可以手动完成:

const keys = Object.keys(obj).filter((key) => key !== 'b')

const objectWithoutB = keys.reduce((acc, key) => {
  acc[key] = key
  return acc
}, {})

为了从 Redux Store 中删除状态,我执行了以下操作并且有效:

case DELETE_SAVED_OBJECT :
  return Object.keys(state) // loops over the current state object and gets the keys
  .filter((Id) => action.Id !== Id) // filters out Id for deletion and return an array
  .reduce((prev, current) => { // turn the array back to an object
    prev[current] = state[current]
    return prev   // return the new state 
  }, {})

如果你使用 ES6,这是单行工作。而且,我确定您使用的是 ES6。

希望对您有所帮助。

const a = {
  a: {
    1: '1',
    2: '2',
    3: '3'
  },
  b: {
    1: '1',
    2: '2',
    3: '3'
  },
  c: {
    1: '1',
    2: '2',
    3: '3'
  }
}

const { b, ...remaining} = a
console.log(remaining)