8

いくつかのアイテムをループして、json オブジェクトを作成しようとしています。各ループはオブジェクトの新しいアイテムである必要がありますが、それを行うにはいくつか問題があります。複数のアイテムではなく、1 つのアイテム セットのみが追加されるようです。

これが私のコードです:

jsonObj = {}
rows.each(function (index) {
    jsonObj["id"] = $this.find('.elementOne').val();
    jsonObj["name"] = $this.find('.elementTwo').text();

});

私のjsonは次のようになります。

{
    id: "3"
    name: "Stuff"
},

これが私がやろうとしていることです:

{
    id: "1"
    name: "Stuff"
},
{
    id: "2"
    name: "Stuff"
},
{
    id: "3"
    name: "Stuff"
}
4

6 に答える 6

28

ここには JSON はありません。混同しないでください:

  • JavaScript オブジェクト (データ構造)
  • JavaScript オブジェクト リテラル (このようなデータ構造を作成するコード)
  • JSON (オブジェクト リテラル表記のサブセットに基づくデータ形式)

オブジェクト (またはその他の種類の JavaScript データ構造) の順序付きリストが必要な場合は、配列を使用します。配列にはpushメソッドがあります。

var myData = [];
rows.each(function (index) {
    var obj = { 
        id: $this.find('.elementOne').val(),
        name: $this.find('.elementTwo').text()
    };
    myData.push(obj);
});
于 2012-06-30T22:34:11.093 に答える
5

反復ごとに新しい値を追加する代わりに、オブジェクトをオーバーライドします。

配列を使用した修正コード:

jsonObj = [];
rows.each(function(index) {
    jsonObj.push({
        'id': $this.find('.elementOne').val(),
        'name': $this.find('.elementTwo').text()
    });
});​
于 2012-06-30T22:34:03.777 に答える
4

必要なのは、オブジェクトの配列です。同じオブジェクトに同じプロパティを複数回書き込もうとすると、上書きされるため、ループの最後の反復の値が表示され、含まれていますidname

質問にjQueryのタグを付けていませんが、jQueryのように見えるので、解決策は次のとおりです。

各反復で同じオブジェクトを参照しているように見えるので、私は自由に変更$thisしました。this$this

var myArray = rows.map(function() {
    return {
        id: $(this).find('.elementOne').val(),
        name: $(this).find('.elementTwo').text()
    };
});
于 2012-06-30T22:35:08.817 に答える
2

これは、毎回オブジェクトの同じプロパティを上書きしているだけだからidですname。それぞれのサブオブジェクトを作成し、それをマスター オブジェクトにプッシュする必要があります (これは非関連であるため、配列に変換しました)。

var jsonObj = []
rows.each(function (index) {
    var temp_obj = {};
    temp_obj["id"] = $this.find('.elementOne').val();
    temp_obj["name"] = $this.find('.elementTwo').text();
    jsonObj.push(temp_obj);
});

[編集] - Mark Eirich の回答が示すように、temp_obj不要です - 代わりに匿名オブジェクトをプッシュできますが、temp_obj何が起こっているのかを明確にするために定義しました。

また、Quentin の非常に優れた点 (JavaScript オブジェクトと JSON の間でよくある混乱) もお読みください。

于 2012-06-30T22:34:23.763 に答える
1
var jsonObj = [];
rows.each(function(index) {
    jsonObj.push({
        id: $this.find('.elementOne').val(),
        name: $this.find('.elementTwo').text()
    });
});
于 2012-06-30T22:33:50.720 に答える