Javascript 如何更新嵌套对象中的字段?

Javascript 如何更新嵌套对象中的字段?,javascript,arrays,object,redux,nested,Javascript,Arrays,Object,Redux,Nested,我有一个非常嵌套的状态,我正在尝试更新选项数组中对象内的字段 const INITIAL_STATE = { player1: { name: null, options: [{ A: null B: { isUse: null, amount: null, extra: { X: null, Y: null } } }, {

我有一个非常嵌套的状态,我正在尝试更新选项数组中对象内的字段

const INITIAL_STATE = {
  player1: {
    name: null,
    options: [{
      A: null
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }, {
      A: null
      B: {
        isUse: null,
        amount: null
        extra: {
          X: null,
          Y: null
        }
      }
    }]
  },
  player2: {
    name: null,
    options: [{
      A: null
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }, {
      A: null
      B: {
        isUse: null,
        amount: null
        extra: {
          X: null,
          Y: null
        }
      }
    }]
  },
}
例如,给定name=player1 2 B和value=cheese,我可以使用以下命令更新选项数组的state.player1.options[2].B:

const keys = name.split(" ");
const player = keys[0]
const idx = keys[1]
const field = keys[keys.length - 1]

return merge({}, state, {
  [player]: {
    ...[player],
    options: state[player].options.map((option, i) => 
      i === idx ? { ...option, [field]: value } : { ...option } 
    )
  }
如何使其更具动态性,以便能够更新field state.player1.options[1].B.extra? 如果在额外的时间之后有另一个巢穴呢?
如果您喜欢使用库,可以使用

代码如下所示

const INITIAL_STATE = {
  player1: {
    name: null,
    options: [{
      A: null,
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }, {
      A: null,
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }]
  },
  player2: {
    name: null,
    options: [{
      A: null,
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }, {
      A: null,
      B: {
        isUse: null,
        amount: null,
        extra: {
          X: null,
          Y: null
        }
      }
    }]
  }
};

const mapper = require("map-factory")();

mapper
 .map()
 .set("player1.options[1].B", {"hi": "bye"});

console.log(JSON.stringify(mapper.execute(INITIAL_STATE), null, 2));


通过这种方式,您可以达到任意级别。

如果传入一个对象而不是数组,您可能只需将其与现有状态合并即可。我必须使用数组作为选项,因为它包含多个对象