我正在努力完成一项我无法实现的操作,我有很多像这样的阵列:
['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合并来做到这一点,但是我真的在努力从每个阵列创建单个对象。
非常感谢,如果您需要更多信息,请告诉我。
干杯
答案 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);