我有一个深度嵌套的对象,在我的代码中,我经常需要像这样操作数据:
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()]
答案 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']);