从Keys数组创建Javascript对象

时间:2016-09-30 07:50:33

标签: javascript jquery arrays json pojo

我正在努力完成一项我无法实现的操作,我有很多像这样的阵列:

['key1', 'key2', 'key3']
['key1', 'key2', 'key4']
['key1', 'key5']

对于每个数组,都有一个相应的值:

value1
value2
value3

我想从每个数组创建一个空对象,它具有基于数组中键位置的层次结构,例如:

['key1', 'key2', 'key3'] => { key1: { key2: { key3: value1 } } }

最后,合并这些对象并构建一个如下对象:

var object = {
    key1: {
        key2: {
            key3: value1,
            key4: value2
        },
        key5: value3
    }
}

我尝试了一些方法,但它们需要三个for循环迭代,我认为有更好的方法来做到这一点,当然最后的合并是最简单的部分,我可以只使用jQuery合并来做到这一点,但是我真的在努力从每个阵列创建单个对象。

非常感谢,如果您需要更多信息,请告诉我。

干杯

2 个答案:

答案 0 :(得分:1)

您可以使用Array#reduce,因为这会返回您需要的对象,而不会在外面保留引用。



function set(object, path, value) {
    var last = path.pop();

    path.reduce(function (o, k) {
        return o[k] = o[k] || {};
    }, object)[last] = value;
}

var a = {};

set(a, ['key1', 'key2', 'key3'], 'value1'); 
set(a, ['key1', 'key2', 'key4'], 'value2'); 
set(a, ['key1', 'key5'], 'value3'); 

console.log(a);




答案 1 :(得分:1)

function create(arr, value, o = {}) {
  a = o;
  // loop trough the object
  for (i = 0; i < arr.length; i++) {
    // add a new object with the name of an array object
    a[arr[i]] = {};
    // important step: move the pointer `a` deeper into the object...
    a = a[arr[i]];
  }
  // set the last object's value to the passed value
  a.value = value;
  return o;
}

像这样使用:

var object = create(["a", "b", "c"], true);
object2 = create(["d", "e", "f"], true, object);