首页 > 解决方案 > 有没有办法在变量中存储对深层对象键的引用?

问题描述

给出以下示例:

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它的价值。

标签: javascripttypescriptobjectreference

解决方案


您需要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')
)


推荐阅读