2017-02-13 2 views
2

私はJavaスクリプトを初めて使用しています。JavaScriptで「アドレス文字列」を使用してjsonオブジェクトからフィールドを取得する

this.state = { 
    A : { 
     B: { 
      C : [ 
      {value : 'bob'}, 
      {value : 'Jim'}, 
      {value : 'luke'}, 
      ] 
     } 
    } 
} 

と私は私がしたいデータの場所を説明する文字列location = 'A.B.C[1]'を持っている:私はオブジェクトを持っている場合 私の質問は、構文です。

なぜ私はdata = this.state[location].valueをやっていいのですか?

と、位置文字列を使用してデータを取得する簡単な「JavaScript」方法はありますか?

どんな助けも素晴らしいでしょう:)

+0

そのための組み込みツールはありません。私がこの問題のために使用した用語の1つは、「オブジェクトグラフのナビゲーション」です。サイトに少なくとも1つの良い重複した質問がありますが、見つけるのは難しいです。 – Pointy

+0

文字列はどのように生成されますか?これはXYの問題になる可能性があります – charlietfl

+0

あなたの場所に正規表現を使用してすべてのレベルを取得します – Weedoze

答えて

5

パスを分割してオブジェクトを縮小することができます。値を設定し

function getValue(o, path) { 
 
    return path.replace(/\[/g, '.').replace(/\]/g, '').split('.').reduce(function (o, k) { 
 
     return (o || {})[k]; 
 
    }, o); 
 
} 
 

 
var o = { A : { B: { C: [{ value: 'Brenda' }, { value: 'Jim' }, { value: 'Lucy' }] } }}; 
 

 
console.log(getValue(o, 'A.B.C[1]').value); // Jim 
 
console.log(getValue(o, 'A.B.C[0].value')); // Brenda 
 
console.log(getValue(o, 'Z[0].Y.X[42]')); // undefined

、あなたがパスを分割し、指定されたオブジェクトを歩いてパスを減らすことができます。オブジェクトが存在しない場合は、名前または配列を使用して新しいプロパティを作成します。後で値を割り当てます。

function setValue(object, path, value) { 
 
    var way = path.replace(/\[/g, '.').replace(/\]/g, '').split('.'), 
 
     last = way.pop(); 
 

 
    way.reduce(function (o, k, i, kk) { 
 
     return o[k] = o[k] || (isFinite(i + 1 in kk ? kk[i + 1] : last) ? [] : {}); 
 
    }, object)[last] = value; 
 
} 
 

 
var test = {}; 
 
setValue(test, "foo.name", "Mr. Foo"); 
 
setValue(test, "foo.data[0].bar", 100); 
 
setValue(test, "and.another[2].deep", 20); 
 
console.log(test);

+0

しかし、そのようなことをしようとしていた、配列は物事を台無しにしていた。このソリューションはどのレベルの配列でも動作しますか?つまり、 "A.B [0] .c" –

+0

はどんなレベルでも動作します。パスが解決できない場合、 'undefined'を返します。 –

+0

幻想的な、それは何らかの魔法のようなものですが、これは完全に機能します。もう一つの簡単な質問は、(フィールドが未定義であっても)setValue(オブジェクト、パス、値)のようなデータを設定する同様のメソッドを持っていますか? :) –

関連する問題