创建“快捷方式”来操作深度嵌套的对象键

时间:2021-08-01 22:45:22

标签: javascript

我有一个深度嵌套的对象,在我的代码中,我经常需要像这样操作数据:

var current_index = test_dict['current']['index']
var current_section = test_dict['current']['section']
test_dict[current_section]['data']['words'][current_index]

所以你可以看到在访问对象时,我使用了引用对象其他部分的变量。这对我很有用,但在我的代码中,我还需要定期更新 current_index 和 current_section。

由于这些变量只是浅拷贝/引用,而不是那些实际值的直接快捷方式,因此执行 current_index++ 会增加 current_index 但不会增加 test_dict['current']['index']

在我的代码中 test_dict 需要存储所有当前信息,所以我试图弄清楚如何直接更新该字典,而无需输入深度嵌套的路径。

我知道我可以使用点表示法,但这不会为我节省任何时间,因为我必须执行以下操作:

test_dict[test_dict.current.section]['data']['words'][test_dict.current.index]

我知道我也可以在函数的开头创建一个对 let current_index 和 let current_section 的引用,但是由于我必须在几乎每个函数中操作 test_dict 对象,因此对其进行数百次定义是不切实际的。

有没有更好的办法?我应该创建一个 getCurrentIndex() 函数然后执行此操作吗?

test_dict[getCurrentSection()]['data']['words'][getCurrentIndex()]

2 个答案:

答案 0 :(得分:1)

<块引用>

由于这些变量只是浅拷贝/引用,而不是那些实际值的直接快捷方式,因此执行 current_index++ 会增加 current_index 但不会增加 test_dict['current']['index']

好的..对象(和数组)是指针/引用..数字、字符串、布尔值等是副本..如果你想要快捷方式,这里有一个例子

var current=test_dict['current'];
var current_index = current['index'];
var current_section = current['section'];
test_dict[current_section]['data']['words'][current_index];
current['index']++ //index inside test_dict would get added to

答案 1 :(得分:-1)

也许你可以试试Proxy object

const dict = {
  current: {
    index: 1,
    section: "test1"
  },
  test1: {
    data: {
      words: ["test1 index0", "test1 index1", "test1 index2"]
    }
  },
  test2: {
    data: {
      words: ["test2 index0", "test2 index1", "test2 index2"],
      other: {
        sub1: {
          sub1_1: ["some", "text", "blah"],
          sub1_2: "single string",
          sub1_3: {}
        }
      }
    },
    blah: {
      sub1: {
        sub1_4: 123456
      }
    }
  }
}

const test_dict = new Proxy(dict, {
  get: function (target, key, receiver)
  {
    const data = target[dict.current.section] && target[dict.current.section][key] || target[key];
    if (typeof data === 'object' && data !== null && !(data instanceof Array))
      return new Proxy(data, this)

    return data instanceof Array && data[dict.current.index] || data || target;
  }
});
console.log("[data][words]", test_dict['data']['words']);
test_dict.current.index = 2
console.log("[data][words]", test_dict['data']['words']);
test_dict.current.section = "test2"
test_dict.current.index = 0
console.log("[data][words]", test_dict['data']['words']);

console.log("data.words", test_dict.data.words);
console.log("data", test_dict.data);
console.log("sub1", test_dict['data']['other']['sub1']);
console.log("sub1_1", test_dict['data']['other']['sub1']['sub1_1']);
console.log("sub1_2", test_dict['data']['other']['sub1']['sub1_2']);
console.log("sub1_3", test_dict['data']['other']['sub1']['sub1_3']);
console.log("blah.sub1_4", test_dict['blah']['sub1']['sub1_4']);