Есть ли способ сохранить ссылку на ключ глубокого объекта в переменной? - PullRequest
0 голосов
/ 04 марта 2020

Приведем следующий пример:

const a = {
  b: {
    c: null
  }
};

let d = ["b", "c"];

let reference = a;

d.forEach(key => (reference = reference[key]));

reference = "fe";

console.log("With a reference to the object deep key.");
console.log(a);

a["b"]["c"] = "fe";
console.log("Directly setting it, what I want.");
console.log(a);

Можно ли изменить значение c со ссылкой на него? Это самый близкий мне вариант, но он явно хранит значение null.

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Вам нужно pop последний ключ из d и использовать его на reference в конце.

let d = ["b", "c"],
    last = d.pop(),
    reference = a;

path.forEach(key => reference = reference[key] || {});

reference[last] = "fe";

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

function updatePath(original, path, value) {
  const last = path.pop();
  path.reduce((acc, key) => acc[key] || {}, original)[last] = value;
  return original
}

const eg1 = {
  b: {
    c: null
  }
}

console.log(
  updatePath(eg1, ['b', 'c'], 'fe')
)

const eg2 = {
  1: {
    2: {
      3: 'initial'
    }
  }
}

console.log(
  updatePath(eg2, ['1', '2', '3'], 'updatedValue')
)
0 голосов
/ 04 марта 2020

Вы можете изменять значения «по ссылке» только для массивов и объектов. Но для объектов и массивов, да, вы можете!

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

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