0

別のJavascriptオブジェクト内に存在するJavascriptオブジェクトを参照する最良の方法は何ですか? たとえば、以下のデータを例にとると、同じデータセット内の別のオブジェクト (場所) への参照である、個人の「家」をどのように参照すればよいでしょうか?

var data = {
    "people": [{
        "name": "Jack",
        "age": "8",
        "home": data.places[0].country
    }, {
        "name": "John",
        "age": "9",
        "home": data.places[1].country
    }],
    "places": [{
        "country": "Holland"
    }, {
        "country": "Germany"
    }]
}
4

4 に答える 4

0

一般に、JSON は「ネストされた」データ形式として使用されます。そのため、(リレーショナル データベースのように) 他のデータへのリレーショナル ポインターの代わりに、データは単純にサブオブジェクトとして直接挿入されます。実際には、これによりデータの重複が発生します (データベース用語では非正規化)。

{
    "people": [{
        "name": "Jack",
        "age": "8",
        "home": "Holland"
    }, {
        "name": "John",
        "age": "9",
        "home": "Germany"
    }],
    "places": [{
        "country": "Holland"
    }, {
        "country": "Germany"
    }]
}

標準の JSON で見た「参照」に最も近いのは、API で使用される場合です ( Tastypieのように)。このセットアップでは、参照は API URI としてエンコードされ、後でクライアントがデータセットの他のビットを要求するために使用できます。

{
    "people": [{
        "name": "Jack",
        "age": "8",
        "home": "/api/v1/place/1/"
    }, {
        "name": "John",
        "age": "9",
        "home": "/api/v1/place/2/"
    }]
}
于 2013-05-09T22:42:15.150 に答える
0

次のようにデータを再フォーマットしてみませんか。

var data.places = {
    "Holland": {otherinfo},
    "Germany": {otherinfo}
};

data.people = [{
        "name": "Jack",
        "age": "8",
        "home": data.places.Holland
    }, {
        "name": "John",
        "age": "9",
        "home": data.places.Germany
    }];
于 2013-05-09T22:42:15.180 に答える
0

すべての場所をリストし、それぞれに ID を割り当てることで問題を解決します。

次に、各人は単に ID を参照します。

var data = {
    "people": [{
        "name": "Jack",
        "age": "8",
        "home_id": 0
    }, {
        "name": "John",
        "age": "9",
        "home_id": 1
    }, {
        "name": "Inge",
        "age": "11",
        "home_id": 0
    }],
    "places": [{
        "id" : 0,
        "country": "Holland"
    }, {
        "id" : 1,
        "country": "Germany"
    }]
}
于 2013-05-09T22:42:47.510 に答える
0

宣言を分割して、参照時に data.places が存在するようにします。

var data = {
    "places": [{
        "country": "Holland"
    }, {
        "country": "Germany"
    }]
}

// data is now defined and has the property "places"

data.people = [{
    "name": "Jack",
    "age": "8",
    "home": data.places[0].country // No more error 
}, {
    "name": "John",
    "age": "9",
    "home": data.places[1].country // No more error either
}]

あなたの質問では、オブジェクトが完全に定義される前に、それ自体の要素を参照していました。これにより、TypeError: Cannot read property 'places' of undefined. 私のソリューションでは、オブジェクト定義を分割して、ピース配列を定義するときに既に存在するようにしdata.peopleましdata.placesた。

オブジェクトを一度に宣言する必要はありません。

于 2013-05-09T22:43:29.340 に答える