3

JSON ファイルからデータを取得して有効に活用する方法を学んでいるところです。for..in ループが役立つことがわかりましたが、JSON から値を取得するにはやりすぎていることはわかっています。ファイル。

これは私の JSON です。このように構造化する必要はありません。

var dollars = { "zipcodes": {
    "one": {
      "donors": {
          "donor_profile1": {
                   "name": "Doug Smith",
                   "address" : "123 main st",
                   "gifts":{
                    "gift0": {
                         "recipient":"Greg",
                         "amount": 45000,
                         "date":"7/1/2013"
                         },
                     "gift1":{
                        "recipient":"Greg",
                        "amount": 6000,
                        "date":"7/1/2013"
                        },
                        "gift2":{
                        "recipient":"Marty",
                        "amount": 2000,
                        "date":"7/1/2013"
                        }
                    }
                   },
            "donor_profile2": {
                        "name": "Bert Bernard",
                        "address" : "123 South st",
                        "gifts": {
                            "gift0": {
                            "recipient":"Greg",
                            "amount": 1200,
                            "date":"7/4/2013"
                              },
                            "gift1":{
                            "recipient":"Marty",
                            "amount": 400,
                            "date":"7/9/2013"
                            },
                            "gift2":{
                            "recipient":"Marty",
                            "amount": 510,
                            "date":"7/21/2013"
                            }
                        }
                    }
                }
            }

各寄付者からの贈り物をすべて集めて合計したいと思います。私はこのプログラムを作成してすべてのギフト金額を受け取りましたが、寄付者によって分けられていません。これをよりきれいにする方法について何かアドバイスはありますか?

var info = dollars.zipcodes.one;


function buildSum(){
for (var key in info){

if (info.hasOwnProperty(key)) {
    var person = info[key];
    };
    for (prop in person) {
        if(person.hasOwnProperty(prop)){
            var name = person[prop].gifts;
        };
            for(value in name){
                if(name.hasOwnProperty(value)){
                    var money = name[value].amount;

                    };
                }

            }                       
    }

}
buildSum();
4

2 に答える 2

1
if (info.hasOwnProperty(key))

そのチェックは必要ありません。Object.prototypeあなたの値は単純なオブジェクトであり、列挙可能なプロパティで拡張するほど愚かな人はいません。

for (prop in person)

間違っていないとしても、それは不必要に思えます。プロパティにアクセスしたいだけなので、 、 、をgifts列挙する必要はありません。と同じことnameaddressgifts

for (var key in info)

を取得しdonorsてそれらを反復処理するだけの場合 - オブジェクトには他のプロパティさえありません。

私のJSONはこのように構造化する必要はありません

gifts次に、およびdonorsコレクションに配列を使用することをお勧めします。ただし、これらgift0gift1などがアイテムに必要な ID である場合を除きます。

var dollars = {
    "zipcodes": {
        "one": {
            "donors": [
                 {
                    "name": "Doug Smith",
                    "address": "123 main st",
                    "gifts": [
                        {
                            "recipient": "Greg",
                            "amount": 45000,
                            "date": "7/1/2013"
                        },
                        {
                            "recipient": "Greg",
                            "amount": 6000,
                            "date": "7/1/2013"
                        },
                        {
                            "recipient": "Marty",
                            "amount": 2000,
                            "date": "7/1/2013"
                        }
                    ]
                },
                {
                    "name": "Bert Bernard",
                    "address": "123 South st",
                    "gifts": [
                        {
                            "recipient": "Greg",
                            "amount": 1200,
                            "date": "7/4/2013"
                        },
                        {
                            "recipient": "Marty",
                            "amount": 400,
                            "date": "7/9/2013"
                        },
                        {
                            "recipient": "Marty",
                            "amount": 510,
                            "date": "7/21/2013"
                        }
                    ]
                }
            ]
        }
    }
}
var donors = dollars.zipcodes.one.donors;
sum = 0;
for (var i=0; i<donors.length; i++) {
    var donor = donors[i],
        gifts = donor.gifts;
    var money = 0;
    for (var j=0; j<gifts.length; j++) {
        money += gifts[j].amount;
    }
    console.log(donor.name+" spent "+money);
    sum += money;
}
console.log("alltogether they spent "+sum);

これをよりきれいにする方法について何かアドバイスはありますか?

Array::reduceより機能的なアプローチに使用できます。

var sum = dollars.zipcodes.one.donors.reduce(function(s, donor) {
    var money = donor.gifts.reduce(function(m, gift) {
        return m+gift.amount;
    }, 0);
    console.log(donor.name+" spent "+money);
    return s+money;
}, 0);
于 2013-07-31T18:50:19.943 に答える