2017-02-04 2 views
1

Ich habe diese klobige Funktion geschrieben, um zwei Strings zu nehmen und ein Objekt daraus zu erstellen. Das Ziel:Schleife diese verschachtelte Obj-Builder-Funktion?

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

Ich bin in der Lage, ohne eine Schleife das rohe Gewalt zu tun, aber ich bin sicher, es kondensiert werden kann und vieles mehr elegant mit einer Schleife durchgeführt. Allerdings explodiert mein Kopf im fraktalen Wahnsinn, während ich versuche, die Verschachtelung und Indizierung zu manipulieren.

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; 
} 

Antwort

2

Sie können wie eine Schleife verwenden, unter

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

Danke schön. Genial. –

+0

Ich bin froh, dass ich geholfen habe. :) –

1

reduzieren rechts 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

Dies ist auch genau richtig ... und wahrscheinlich der prägnantere/bessere Weg, es zu tun. –

1

Hier gehen Sie:

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; 
} 

mit einer Geige: https://jsfiddle.net/qhnsxwjm/

0

Hallo hier ist meine Art und Weise, es zu tun:

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

Es ist eine Fuzzy-Art und Weise, nicht viel strenger. Ich werde weiter bearbeiten und verbessern.