2016-02-29 3 views
1

У меня есть следующий массив:преобразования массива объекта Javascript

["recordList", "userList", "lastChanged"] 

И я хочу что-то вроде этого:

lastChangedValue = "231231443234";   

var object = {}; 

object = { 
    recordList: { 
     userList: { 
     lastChanged: lastChangedValue 
     } 
    } 
} 

Как я могу это сделать? Спасибо заранее.

+0

ли вложенности последовательным? – lintmouse

+0

Итак, вы хотите, чтобы каждый элемент массива был объектом, содержащим ключи под ним в качестве ключей? – Marie

ответ

1

Вы можете перебирать имена свойств и создать один вложенный уровень нового объекта в каждой итерации:

var props = ["recordList", "userList", "lastChanged"]; 
var lastChangedValue = "231231443234"; 

var obj = {} 
var nested = obj; 
props.forEach(function(o, i) { 
    nested[o] = i === props.length - 1 ? lastChangedValue : {}; 
    nested = nested[o]; 
}); 

console.log(obj); 
2

Попробуйте это:

var array = ["recordList", "userList", "lastChanged"]; 
 

 

 
var value = "231231443234";   
 

 
function arrayToObject(array, object, value) { 
 
    var ref = object; 
 
    for (var i=0; i<array.length-1; ++i) { 
 
    if (!ref[array[i]]) { 
 
     ref[array[i]] = {}; 
 
    } 
 
    ref = ref[array[i]] 
 
    } 
 
    ref[array[array.length-1]] = value; 
 
    return object; 
 
} 
 
alert(JSON.stringify(arrayToObject(array, {}, value)));

1

Есть, вероятно, куча способов сделать это, один путь с уменьшением

var keys = ["recordList", "userList", "lastChanged"]; 
var temp = keys.slice().reverse(), 
    lastChangedValue = "231231443234"; 
var result = temp.reduce(function (obj, val, ind, arr) { 
    if (ind===0) { 
    obj[val] = lastChangedValue; 
    return obj; 
    } else { 
    var x = {}; 
    x[val] = obj; 
    return x; 
    } 
}, {}); 
console.log(result); 
+0

Имейте в виду, что сокращение было введено в IE10 и не поддерживается в IE9 или ниже. – Marie

1

Решение с помощью рекурсии

var fields = ["recordList", "userList", "lastChanged"]; 
 
lastChangedValue = "231231443234"; 
 
var object = {}; 
 

 
(function addFields(o, i, v) { 
 
    if (i == fields.length - 1) { 
 
     o[fields[i]] = v; 
 
     return; 
 
    } 
 
    o[fields[i]] = {}; 
 
    addFields(o[fields[i]], ++i, v) 
 
})(object, 0, lastChangedValue); 
 

 

 
alert(JSON.stringify(object));

Смежные вопросы