2016-05-26 2 views
3

にプロパティチェーンを追加し、それを返すようには、2行目は明らかに機能している間は、JSオブジェクト

var some_object = {}; 
some_object.prop_a = "hi"; 
some_object.prop_b.prop_c.prop_d = "ho"; 

...の追加プロパティの追加プロパティにプロパティを追加するには1行で可能ライン3 doesntのですcannot read property of undefinedエラーです。私は知っている、prop_bとprop_c prop_dを割り当てる必要があります存在しません。しかし、ネストされたオブジェクトのいくつかのレベルがまだ存在していなくても、ネストされたプロパティを追加するなど、何をしたいのですか?

+0

いいえ、ありません。あなたが書いているオブジェクトを定義しなければなりません。 – BenM

+2

すぐに使えますが、プロパティとオブジェクトの連鎖をとり、必要に応じて空のオブジェクトを追加する関数を書くことは間違いありません。 –

+0

http:// stackoverflowを確認してください。com/questions/37437805/convert-map-to-json-object-in-javascript/37438729?noredirect = 1#comment62398771_37438729 – IMTheNachoMan

答えて

3

あなたは確かにこれを行う関数を書くことができます。あなたはスロットが割り当て前のオブジェクトであることを確認するためにメソッドを呼び出すことができ

function addPropertyChain(chain, val, obj) { 
 
    var propChain = chain.split("."); 
 
    if (propChain.length === 1) { 
 
     obj[propChain[0]] = val; 
 
     return; 
 
    } 
 
    var first = propChain.shift(); 
 
    if (!obj[first]) { 
 
     obj[first] = {}; 
 
    }  
 
    addPropertyChain(propChain.join("."), val, obj[first]); 
 
} 
 

 
var some_object = {}; 
 
addPropertyChain("prop_b.prop_c.prop_d","ho",some_object); 
 

 
console.log(some_object);

+0

私はこの問題について同じ考えを持っていたと思います。よくやった。 –

+0

ありがとう!他に方法がない場合は、自分で関数を書くことについて考えてみてください。あなたはかなり便利で、使用されます! – weidler

3

私は、prop_dとprop_cはprop_dを割り当てるべきではないことを知っています。

このような場合は、これを行うことができます:

some_object.prop_b = { 
    prop_c : { 
    prop_d : "ho" 
    } 
}; 

(または、1行:)

some_object.prop_b = { prop_c : { prop_d : "ho" } }; 

であなただけのネストされたオブジェクトを作成するためにはJavaScriptのobject initializer syntaxを使用していることを。

ただし、既存の値がすでに存在する場合は、既存のprop_bまたはprop_b.prop_cの値を上書きするので注意してください。

+0

それについても考えましたが、既に指摘したように上書きする。 – weidler

0

:おそらくこのような何か。欠点は、パスを文字列として指定していることです。あなたはチェーンを歩かなければならないでしょう。

function ensurePropertyOnObject(o, m) 
{ 
    var props = m.split('.'); 
    var item; 
    var current = o; 

    while(item = props.shift()) { 
     if(typeof o[item] != 'object') { 
      current[item] = {}; 
     } 
     current = o[item]; 
    }  
} 

ensurePropertyOnObject(some_object, "prop_b.prop_c.prop_d"); 
some_object.prop_b.prop_c.prop_d = "ho"; 
console.log(some_object); 

例を参照してください:https://jsfiddle.net/ho4k02fr/

0

は動的に私はあなたが引数としてネストされた特性を提供するObject.prototype.setNestedValue()Object.prototype.getNestedValue()と呼ばれる2つのオブジェクトのメソッドを発明したオブジェクトのプロパティにアクセスして設定します。 Object.prototype.setNestedValue()の場合、最後の引数は最後に設定される値です。このように行く。

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 

 
Object.prototype.setNestedValue = function(...a) { 
 
    return a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) 
 
                       : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), 
 
                       this[a[0]].setNestedValue(...a.slice(1))) 
 
         : this[a[0]] = a[1]; 
 
}; 
 

 
var some_object = {}; 
 
some_object.prop_a = "hi"; 
 
some_object.setNestedValue("prop_b","prop_c","prop_d","ho"); 
 
console.log(JSON.stringify(some_object,null,2));

また、配列オブジェクトを追加することができます。そのためには番号型でインデックスを入力する必要があります。例を持っている...

Object.prototype.getNestedValue = function(...a) { 
 
    return a.length > 1 ? (this[a[0]] !== void 0 && this[a[0]].getNestedValue(...a.slice(1))) : this[a[0]]; 
 
}; 
 

 
Object.prototype.setNestedValue = function(...a) { 
 
    return a.length > 2 ? typeof this[a[0]] === "object" && this[a[0]] !== null ? this[a[0]].setNestedValue(...a.slice(1)) 
 
                       : (this[a[0]] = typeof a[1] === "string" ? {} : new Array(a[1]), 
 
                       this[a[0]].setNestedValue(...a.slice(1))) 
 
         : this[a[0]] = a[1]; 
 
}; 
 

 
var some_object = {}; 
 
some_object.prop_a = "hi"; 
 
some_object.setNestedValue("prop_b",3,"prop_d","yay"); 
 
some_object.setNestedValue("prop_b",0,"prop_d","zero this is"); 
 
some_object.setNestedValue("prop_b",1,"prop_d","i am the one"); 
 
some_object.setNestedValue("prop_b","prop_c","prop_d","ho"); 
 
console.log(JSON.stringify(some_object,null,2));

はあなたがprop_cは下士官じゃないが、それはまだprob_bするために割り当てられた配列のプロパティとして存在し、それは完全にアクセス可能だということに気づくでしょうします。

関連する問題