2017-11-25 6 views
1

オブジェクト内のパスを受け入れ、そのキーを作成する関数を作成しようとしています。オブジェクトを更新するためのキーとして文字列を使用する方法

例えば都市を更新したい場合、これは会社の子オブジェクトで、プロパティの子オブジェクトです。このようなことができるでしょう: originalObj ['property'] ['同社「] [」都市 '] =テスト

ここでは、私のコードは、これまでのところです:

function updateObj(path, value){ 
    let valuePath = path.split(',') 
    let key='' 
    for(let i=0; i<valuePath.length ; i++){ 
    key = key+`[valuePath[${i}]]` 
    } 
    //key = [valuePath[0]] [valuePath[1]] [valuePath[2]] 
    originalObj[key] = value 
    } 

setObj('property,company,city', test) 
+0

ああ、面白いです。これは難しいことではありませんが、JavaScript 101コースでは素晴らしい宿題になります。 – melpomene

+0

何を試しましたか...質問は何ですか? – vol7ron

答えて

1
function updateObj(obj, path, value){ 
path.split(",").slice(0,-1).reduce((obj, key) => obj[key] || (obj[key] = {}), obj)[path.split(",").pop()] = value; 
} 
+1

これは、誰のコードのどこでも使用すべきではない驚くべき1ライナーです。 –

+0

冗長分割 – Intervalia

+0

@intervaliaはまだそれをキャッシュするための宣言またはIIFEよりも短い –

2

あなたはパスの最後のキーを保存し、最終的に取得するための一時的なオブジェクトを使用することができます値を割り当てるオブジェクト。 Array#reduce

function updateObj(path, value) { 
 
    var valuePath = path.split(','), 
 
     last = valuePath.pop(); 
 

 
    valuePath.reduce((o, k) => o[k] = o[k] || {}, object)[last] = value; 
 
} 
 

 
var object = {}; 
 

 
updateObj('property,company,city', 'New York'); 
 

 
console.log(object);

0

function updateObj(path, value) { 
 
    var valuePath = path.split(','), 
 
     last = valuePath.pop(), 
 
     temp = object; 
 

 
    for (let i = 0; i < valuePath.length; i++) { 
 
     temp = temp[valuePath[i]]; 
 
    } 
 
    temp[last] = value; 
 
} 
 

 
var object = { property: { company: { city: 'London' } } }; 
 

 
updateObj('property,company,city', 'New York'); 
 

 
console.log(object);

これを試してみてください:

function setObj(originalObj, path, value){ 
    var parts = path.split(','); 
    var lastKey = parts.pop(); 
    var obj = originalObj; 

    parts.forEach(
    function(key) { 
     key = key.trim(); 
     obj[key] = obj[key] || {}; 
     obj = obj[key]; 
    } 
); 

    obj[lastKey] = value; 
} 

    var originalObj = {}; 
    var test = "This is a test"; 
    setObj(originalObj, 'property,company,city', test) 

    console.log(JSON.stringify(originalObj,0,2)); 

あなたのリストを歩き回り、最後のものを除くすべてのサブオブジェクトを作成します。その後、最後のものをキーとして使用してvalueを保存します。

このコードの利点は、元のObject変数名を想定していないことです。純粋で元のオブジェクト構造に影響しないようにするには、これらの小さな変更を加えることができます。

function setObj(originalObj, path, value){ 
    var parts = path.split(','); 
    var lastKey = parts.pop(); 
    var newObj = Object.assign({}, originalObj); 
    var obj = newObj; 

    parts.forEach(
    function(key) { 
     obj[key] = Object.assign({}, obj[key] || {}); 
     obj = obj[key]; 
    } 
); 

    obj[lastKey] = value; 
    return newObj; 
} 

    var originalObj = {animals: {dog:"bark",cat:"meow"},property:{company:{name:"Fred's Things"}}}; 
    var test = "This is a test"; 
    var result = setObj(originalObj, 'property,company,city', test) 


    console.log(JSON.stringify(originalObj,0,2)); 
    console.log(JSON.stringify(result,0,2)); 
関連する問題