Как обновить поле внутри вложенного объекта? - PullRequest
0 голосов
/ 21 февраля 2020

У меня чрезвычайно вложенное состояние, и я пытаюсь обновить поле внутри объекта в массиве параметров.

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", я могу обновить состояние .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 } 
    )
  }
  1. Как мне сделать это более динамичным c, чтобы иметь возможность обновлять поле state.player1.options [1 ] .B.extra?
  2. Что, если после лишнего было другое вложение?

1 Ответ

0 голосов
/ 21 февраля 2020

Если вы хотите использовать библиотеку, это можно упростить, используя map-factory

Код будет выглядеть следующим образом

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));

Вы можете go столько уровней, сколько вы хотите, используя этот способ.

...