JavaScript:创建一个将多个键映射到值的映射?

时间:2015-11-02 03:47:02

标签: javascript

我有一个键列表和一个值。例如:

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;
        }
    }
}

如何制作地图?

3 个答案:

答案 0 :(得分:2)

您可以尝试存储对最后创建的内部对象的引用,并在循环中更深入,以使其处于线性时间:

&#13;
&#13;
select curdate() as data_date
&#13;
&#13;
&#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)

如果您不想维护对象的层次结构,我建议您连接键并将值与连接字符串一起存储为键。

这假设您始终具有相同的键阵列。如果你的密钥数组是外部提供的,你可以在加入之前进行排序。

请参阅代码段。

&#13;
&#13;
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;
&#13;
&#13;