【问题标题】:Converting js array into dictionary map将js数组转换为字典映射
【发布时间】:2014-09-12 21:31:43
【问题描述】:

我有这个数组:

["userconfig", "general", "name"]

我希望它看起来像这样

data_structure["userconfig"]["general"]["name"]

这个功能我试过了:

inputID = "userconfig-general-name"

function GetDataByID(inputID){

    var position = '';

    for (var i = 0; i < inputID.length; i++) {
        var hirarchy = inputID[i].split('-');

        for (var index = 0; index < hirarchy.length; index++) {
            position += '["'+ hirarchy[index] +'"]';
        }
    }
    return data_structure[position];
}

hirarchy 是数组。我得到[position] 作为一个不能正常工作的字符串。

如何制作一个通过数组动态构建对象路径的js函数?

【问题讨论】:

  • 你有什么尝试吗?
  • 这种结构的价值是什么?
  • 我已经编辑了我的问题,请再次查看
  • 为什么将inputID[i] 拆分为'-'

标签: javascript arrays object dictionary


【解决方案1】:

递归函数

var array = ["userconfig", "general", "name"];

function toAssociative(array) {
    var index = array.shift();
    var next = null;
    if (array.length > 0) {
        next = toAssociative(array);
    }

    var result = new Array();
    result[index] = next;

    return result;
}

【讨论】:

    【解决方案2】:
    var arr = ["userconfig", "general", "name"];
    var dataStructure = arr.reduceRight(function (value, key) {
        var obj = {};
        obj[key] = value;
        return obj;
    }, 'myVal');
    

    最终结果为:

    { userconfig : { general : { name : 'myVal' } } }
    

    请注意,reduceRight 方法可能需要 polyfill:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/ReduceRight

    【讨论】:

    • 很好,+1。注意:arr.reverse().reduce( /*same callback*/, 'myVal' ) 是等价的
    【解决方案3】:

    下面的函数将接受一个要修改的对象和一个填充了所需属性的数组:

    function objPath(obj,path){
       path.forEach(function(item){
          obj[item] = {};
          obj = obj[item];
       });
    }
    
    var myobj = {};
    objPath(myobj,["test","test2","test3"]);
    
    console.log(myobj);
    //outputs
    Object {test: Object}
        test: Object
            test2: Object
                test3: Object
    

    函数循环遍历数组,将新对象属性创建为新对象。然后它将对新对象的引用放入obj,以便可以在新对象上创建下一个属性。

    JSFiddle

    【讨论】:

      猜你喜欢
      • 2017-03-10
      • 2018-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-14
      • 2017-06-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多