Как обновить значение в 2D массиве в редукторном редукторе? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь обновить значение по индексу (i, j) в двумерном массиве, используя оператор распространения в редукторном редукторе. Мой редуктор выглядит так:

export default (state, action) => {
switch(action.type) {
 case INSERT:
   return {
    ...state,
    myArray: [
     ...state.myArray.slice(0, action.i),
     ...state.myArray[action.i] : [
         ...state.myArray[action.i].slice(0, action.j),
         action.newValue,
         ...state.myArray[action.i].slice(action.j),
     ]
     ...state.myArray.slice(action.i),
    ]
  },
};

Мой массив выглядит так:

let my Array = [ [1,2,5],[5,8,9],[2,6,9]]

Как мне обновить новое значение по индексу (i, j), используя редукционные шаблоны неизменяемого обновления?

Ответы [ 3 ]

0 голосов
/ 14 сентября 2018

let arr = [[1,2,5],[5,8,9],[2,6,9]];

const payload = 6;
const i = 1;
const j = 2;

const result = arr.map((inner, index) => (i === index) ? inner.reduce(
    (arr, item, index) => j === index ? [...arr, payload, item] : [...arr, item], []) : inner);

console.log(result);
0 голосов
/ 14 сентября 2018

Или вообще без map и только с оператором распространения и динамическим ключом:

let arr = [
  [1, 2, 5],
  [5, 8, 9],
  [2, 6, 9]
];

const newValue = 6;
const i = 1;
const j = 2;

let myArr = Object.assign([...arr], {
  [i]: Object.assign([...arr[i]], {
    [j]: newValue
  })
})

console.log(myArr);
0 голосов
/ 14 сентября 2018

Вы можете использовать два вложенных вызова .map для обновления значений по пути i и j

return {
    ...state,
    myArray: state.myArray.map((innerArray, index) => {
        if (index === action.i) return innerArray.map((item, index) => {
            if (index === action.j) return action.newValue
            return item
        })
        return innerArray
    })
}

Это намного проще, чем использование оператора распространения, поскольку значение, которое вам нужно изменить, имеет динамический индекс. Плюс, он неизменен, что является редукционным способом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...