2016-10-19 4 views
1

変数を使ってオブジェクトのプロパティを設定したいのですが、変数multipartを時々別の部分にすることができます。以下のコードは動作しませんが、私が達成しようとしていることがわかると思います。変数をオブジェクトのマルチパートプロパティに設定できますか?

var mekBldr = { 
    mecha: { 
    rightLimbs: { 
     legs: { 
      rightleg01: { 
       cost: 0, 
       classification: '' 
      } 
     } 
    }, 
    leftLimbs: { 
     legs: { 
      leftleg01: { 
       cost: 0, 
       classification: '' 
      } 
     } 
    } 
    } 
}; 

var part1 = 'leftLimbs'; 

var part2 = 'legs'; 

var multi = part1[part2]; 

// the goal: mekBldr.mecha.leftLimbs.legs.leftleg01.cost = 5; 

mekBldr.mecha[multi].leftleg01.cost = 5; 
+1

いいえ、あなたはそれを直接行うことはできません。このような動的なオブジェクトグラフのナビゲーションを可能にするコードを記述して使用する必要があります。 (いくつかの良い解決策がある古い質問が少なくとも1つあります;私は周りを見回します) – Pointy

答えて

2

これはどうですか。

Object.prototype.select = function(route) { 
    var newObj = this; 

    route.forEach(function(key) { 
     newObj = newObj[key]; 
    }); 

    return newObj; 
}; 

このように使用することができます。

var mekBldr = { 
    mecha: { 
     rightLimbs: { 
      legs: { 
       rightleg01: { 
        cost: 0, 
        classification: '' 
       } 
      } 
     }, 
     leftLimbs: { 
      legs: { 
       leftleg01: { 
        cost: 0, 
        classification: '' 
       } 
      } 
     } 
    } 
}; 

var part1 = 'leftLimbs'; 
var part2 = 'legs'; 

var multi = [part1, part2]; 

mekBldr.mecha.select(multi).leftleg01.cost = 5; 
+0

とてもいいです。私は "新しい"変数を別の名前に変更しなければなりませんでした。また、配列を渡すだけでいいです。私が文字列を渡すと、それは壊れます。 – user1592980

+0

ええ、「新」が問題になることを見て、私の答えを更新するはずです。文字列の例として 'a.split( '')'を使うことができます。 – Zak

+0

私はこれで大きな問題にぶつかった! jQueryでは実行されません。私は次のものを追加しなければならなかった: Object.defineProperty(Object.prototype、 'select'、{ 値:function(){}、 列挙可能:false }); これはjQueryエラーを停止しましたが、動作を停止しました。任意のアイデアをどのようにこれを解決するには? – user1592980

関連する問題