2017-02-04 62 views
1

我已經寫了這個笨重的功能,採取兩個字符串,並創建一個對象。我們的目標:循環這個嵌套的obj構造函數?

// 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)); 

這是一個模糊的方式,沒有太多嚴格。我會繼續編輯和改進。