Как изменить значение n-го элемента массива, индексы которого указываются массивом в Javascript - PullRequest
2 голосов
/ 17 апреля 2020

У меня есть n-мерный массив, и я хочу получить к нему доступ / изменить элемент, используя другой массив для указания индексов.

Я выяснил, как получить доступ к значению, однако я не знаю, как изменить исходное значение.

// Arbitrary values and shape
arr = [[[8, 5, 8],
        [9, 9, 9],
        [0, 0, 1]],

       [[7, 8, 2],
        [9, 8, 3],
        [9, 5, 6]]];

// Arbitrary values and length
index = [1, 2, 0];

// The following finds the value of arr[1][2][0]
// Where [1][2][0] is specified by the array "index"

tmp=arr.concat();

for(i = 0; i < index.length - 1; i++){
  tmp = tmp[index[i]];
}

// The correct result of 9 is returned
result = tmp[index[index.length - 1]];
  1. Как изменить значение в массиве?

  2. Существует ли лучший / более эффективный способ доступа к значению?

Ответы [ 3 ]

2 голосов
/ 17 апреля 2020

Это классический c рекурсивный алгоритм, поскольку каждый шаг включает в себя один и тот же алгоритм:

  • Извлечение первого индекса из индексов.
  • Продолжайте работать с массивом, который недавно добавленный индекс указывает на.

Пока вы не доберетесь до последнего элемента в indices - затем замените соответствующий элемент в массиве самого низкого уровня.

function getUpdatedArray(inputArray, indices, valueToReplace) {
  const ans = [...inputArray];
  const nextIndices = [...indices];
  const currIndex = nextIndices.shift();
  let newValue = valueToReplace;

  if (nextIndices.length > 0) {
    newValue = getUpdatedArray(
      inputArray[currIndex],
      nextIndices,
      valueToReplace,
    );
  } else if (Array.isArray(inputArray[currIndex])) {
    throw new Error('Indices array points an array');
  }

  ans.splice(currIndex, 1, newValue);
  return ans;
}

const arr = [
  [
    [8, 5, 8],
    [9, 9, 9],
    [0, 0, 1]
  ],

  [
    [7, 8, 2],
    [9, 8, 3],
    [9, 5, 6]
  ]
];
const indices = [1, 2, 0];
const newArr = getUpdatedArray(arr, indices, 100)
console.log(newArr);
1 голос
/ 17 апреля 2020

Вы можете изменить значения в массиве следующим образом:

arr[x][y][z] = value;

Помогает ли это?

0 голосов
/ 17 апреля 2020

Я думаю, что вы ищете это:

arr[index[0]][index[1]][index[2]] = value;

Мне трудно понять, что вы пытаетесь сделать во второй части вашего примера.

...