次のようなデータ構造があります:
var someObject = {
'part1' : {
'name': 'Part 1',
'size': '20',
'qty' : '50'
},
'part2' : {
'name': 'Part 2',
'size': '15',
'qty' : '60'
},
'part3' : [
{
'name': 'Part 3A',
'size': '10',
'qty' : '20'
}, {
'name': 'Part 3B',
'size': '5',
'qty' : '20'
}, {
'name': 'Part 3C',
'size': '7.5',
'qty' : '20'
}
]
};
そして、次の変数を使用してデータにアクセスしたいと思います:
var part1name = "part1.name";
var part2quantity = "part2.qty";
var part3name1 = "part3[0].name";
part1name にはsomeObject.part1.name
の値 (「Part 1」) を入力する必要があります。part2quantity も同様に 60 を入力します。
純粋な JavaScript または JQuery のいずれかを使用してこれを実現する方法はありますか?
ベストアンサー1
すでに持っていた類似のコードに基づいてこれを作成したのですが、動作するようです:
Object.byString = function(o, s) {
s = s.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
s = s.replace(/^\./, ''); // strip a leading dot
var a = s.split('.');
for (var i = 0, n = a.length; i < n; ++i) {
var k = a[i];
if (k in o) {
o = o[k];
} else {
return;
}
}
return o;
}
使用法::
Object.byString(someObj, 'part3[0].name');
実際のデモはこちらをご覧くださいhttp://jsfiddle.net/alnitak/hEsys/
編集:一部の人は、左端のインデックスがオブジェクト内の正しくネストされたエントリに対応していない文字列が渡された場合、このコードがエラーをスローすることに気付きました。これは正当な懸念事項ですが、私の意見では、この関数が無効なインデックスに対してtry / catch
黙って戻るのではなく、呼び出し時にブロックを使用して対処するのが最善です。undefined