[英]Create nested object dynamically with forEach
我有一個'path'字符串: 'profile.name.en'
;
我想用它動態創建一個對象。 我正在使用此功能及其工作:
function set(obj, path, value) {
var schema = obj; // a moving reference to internal objects within obj
var arr = path.split('.');
var len = arr.length;
for(var i = 0; i < len-1; i++) {
var elem = arr[i];
if( !schema[elem] ) schema[elem] = {};
schema = schema[elem];
}
schema[arr[len-1]] = value;
return schema;
}
像這樣使用它:
var a = {};
var path = 'profile.name.en';
var profileName = 'OleFrank';
var o = set(a, path, profileName);
// result
{
profile: {
name: {
en: 'OleFrank'
}
}
}
我試圖重構為使用forEach而不是for循環,但是后來它不再起作用了。 為什么是這樣??
您可以使用Array#reduce
,因為這將返回所需的對象,而無需在外部保留引用。
function set(object, path, value) { var keys = path.split('.'), last = keys.pop(); keys.reduce(function (o, k) { return o[k] = o[k] || {}; }, object)[last] = value; } var a = {}, path = 'profile.name.en', profileName = 'OleFrank'; set(a, path, profileName); // no need of an assignment, because of // call by reference with an object console.log(a);
function set(object, path, value) { var keys = path.split('.'), last = keys.pop(); keys.forEach(function (k) { object[k] = object[k] || {}; object = object[k]; }); object[last] = value; } var a = {}, path = 'profile.name.en', profileName = 'OleFrank'; set(a, path, profileName); console.log(a);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.