2017-02-04 18 views
1

Я написал эту неуклюжую функцию, чтобы взять две строки и создать из них объект. Цель:Запустить эту встроенную функцию buj builder?

// buildObj("house.wall.paint.color", "blue"); 
// returns {house: {wall: {paint: {color: "blue"}}}} 

Я могу сделать это перебор без петли, но я уверен, что это может быть сжата и сделать гораздо более элегантно с петлей. Тем не менее, моя голова взрывается фрактальным безумием, когда я пытаюсь манипулировать вложением и индексированием.

FIDDLE

var p1 = "house.wall.paint.color"; 
var p2 = "blue"; 
var arr = []; 
var obj = []; 

buildObj(p1, p2); 

console.log(obj); 

function buildObj(p1, p2) { 
    var keys = p1.split('.'); 
    var val = p2; 
    var arr = $.merge(keys, [val]); 
    var prop = {}; 
    var prop2 = {}; 
    var prop3 = {}; 
    var prop4 = {}; 
    var last = arr.length - 1; 
    prop[arr[last - 1]] = arr[last]; 
    obj = prop; 
    prop2[arr[last - 2]] = obj; 
    obj = prop2; 
    prop3[arr[last - 3]] = obj; 
    obj = prop3; 
    prop4[arr[last - 4]] = obj; 
    obj = prop4; 
    return obj; 
} 

ответ

2

Вы можете использовать цикл, как показано ниже

var p1 = "house.wall.paint.color"; 
 
var p2 = "blue"; 
 
var obj = {}; 
 

 
buildObj(obj, p1, p2); 
 
console.log(obj); 
 

 

 
function buildObj(obj, path, value) { 
 
    var keyPath = path.split("."); 
 
    
 
    var lastKeyIndex = keyPath.length-1; 
 
    for (var i = 0; i < lastKeyIndex; ++ i) { 
 
    key = keyPath[i]; 
 
     
 
    if (!(key in obj)) { 
 
     obj[key] = {} 
 
    } 
 
    obj = obj[key]; 
 
     
 
    } 
 
    obj[keyPath[lastKeyIndex]] = value; 
 

 
}

+0

Благодарим вас. Потрясающие. –

+0

Рад помочь. :) –

1

Уменьшить правый FTW: https://jsfiddle.net/kL6es676/4/

function buildObj(keyStr, val) { 
    return keyStr.split('.') 
    .reduceRight(function(obj, key, i, arr) { 
     if (i === arr.length - 1) { 
     obj[key] = val 
     return obj 
     } else { 
     var newObj = {} 
     newObj[key] = obj 
     return newObj 
     } 
    }, {}) 
} 
+0

Это также место на ... и, вероятно, более краткий/лучший способ сделать это. –

1

Здесь вы идете:

function arrayToNestedObj(str, val) { 
    const strArray = str.split('.'); 
    const strLength = strArray.length; 
    const obj = {}; 
    let o = obj; 
    for (let i = 0; i < strLength; i++) { 
    o = o[strArray[i]] = i === strLength - 1 ? val : {} 
    } 

    return obj; 
} 

с скрипкой: https://jsfiddle.net/qhnsxwjm/

0

Привет вот мой способ сделать это:

let objStr = "house.wall.paint.color", 
    objVal = "Orange", 
    newObj = "", 
    i = 0; 

objStr.replace(new RegExp("\\w+", "g"), (m) => { 
    i++; 
    newObj += "\{" + "\"" + m + "\"" + "\:"; 
}); 
newObj += "\"" + objVal + "\""; 
for (var j = 0; j < i; j++) newObj += "}"; 

console.log(JSON.parse(newObj)); 

Это нечеткий путь, не очень строгим. Я буду продолжать редактировать и улучшать.

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

  • Нет связанных вопросов^_^