我有一个键列表和一个值。例如:
keys = ["keyA", "keyB", "keyC"];
value = 100;
我正在尝试创建一个创建地图的功能,以便:
map["keyA"]["keyB"]["keyC"] = 100;
我认为这是基于here给出的答案的最佳数据结构:
无论如何,挑战我的部分是我需要一个能为任意数量的键创建地图的功能。我已尝试在循环中执行此操作但无法使其工作,因为我不知道如何访问我的地图的不同级别,但它也感觉马虎:
for(var i=0; i<keys.length; i++){
for(var j=0; j<i; j++){
maps[keys[0]]...[keys[j]] = {};
if(j+1 === i){
maps[keys[0]]...[keys[j]][keys[i]] = value;
}
}
}
如何制作地图?
答案 0 :(得分:2)
您可以尝试存储对最后创建的内部对象的引用,并在循环中更深入,以使其处于线性时间:
select curdate() as data_date
&#13;
答案 1 :(得分:1)
假设这个结构是一个嵌套具有任意深度的树,首先你可以从一个帮助函数中受益,它可以让你安全地访问可能存在的不存在的路径:
function path(obj, str) {
return str.split('.').reduce(function (acc, key) {
return acc instanceof Object ? acc[key] : undefined;
}, obj);
}
你还想要一种方法来整齐地设置这样的路径:
function setPath(obj, str, val) {
var path = str.split('.');
var key = path.pop();
var target = path.reduce(function(acc, key) {
return acc[key] = acc[key] instanceof Object ? acc[key] : {};
}, obj);
target[key] = val;
}
然后你有一个干净的界面来存储和检索这些数据。
map = {};
setPath(map, 'keyA.keyB.keyC', 100);
path(map, 'keyA.keyB.keyC') // 100;
path(map, 'keyA.keyX.keyY') // undefined;
如果您愿意,可以使用密钥数组而不是点符号路径,如此处所示(只省略分割步骤)。
请注意,如果您从不感兴趣访问除树叶以外的树中的节点,或希望能够同时拥有map.a.b
和 map.a
的值,你可以通过一个深度更简单地做到这一点:
map[keys.join('.')] = 100;
由于您在评论中添加了此处的目标实际上只是将值与 set 的键相关联,并且根本没有实际的树结构:< / p>
function get(map, keys) {
var key = keys.sort().join('.');
return map[key];
}
function set(map, keys, val) {
var key = keys.sort().join('.');
map[key] = val;
}
如果句点中的句点是合理的字符,请替换您可以安全保留的其他字符。
答案 2 :(得分:1)
如果您不想维护对象的层次结构,我建议您连接键并将值与连接字符串一起存储为键。
这假设您始终具有相同的键阵列。如果你的密钥数组是外部提供的,你可以在加入之前进行排序。
请参阅代码段。
var keys = ["keyA", "keyB", "keyC", "keyD", "keyE"];
var value = 568;
var datastructure = {};
datastructure[keys.join("-")] = value;
document.getElementById("output").innerHTML = datastructure[keys.join("-")];
&#13;
<span id="output"></span>
&#13;