在数据对象上重构jQuery的每个循环

时间:2015-01-29 13:56:35

标签: jquery object refactoring each jquery-csv

我使用jQuery CSV(https://github.com/evanplaice/jquery-csv)将csv文件转换为jQuery对象。

以下是代码:

    $.ajax({
        type: "GET",
        url: "/path/myfile.csv",
        dataType: "text",
        success: function(data) {
        // once loaded, parse the file and split out into data objects
        // we are using jQuery CSV to do this (https://code.google.com/p/jquery-csv/)

        var data = $.csv.toObjects(data);
    });

我正在将公司的bushels_per_day值相加,并希望重构我的代码以使其更紧凑。

使用这个答案:Sum values in jQuery object by key,我可以循环使用$ .each();

对象格式如下:

    var data = [
        "0":{
            bushels_per_day: "145",
            plant_city: "Decatur",
            plant_company: "AGP",
        },
        "1":{
            bushels_per_day: "125",
            plant_city: "Cedar Rapids",
            plant_company: "AGP",
        },
        "2":{
            bushels_per_day: "345",
            plant_city: "Ralston",
            plant_company: "AGP",
        },
        "3":{
            bushels_per_day: "55",
            plant_city: "Dawson",
            plant_company: "ADM",
        },
        "4":{
            bushels_per_day: "55",
            plant_city: "Dawson",
            plant_company: "ADM",
        },
        // ... more objects
    ]

这是$ .each()循环:

    var sumADM = 0;
    var sumAGP = 0;
    // var for each company



    $.each(data, function (index, value) {
        var capacity = parseInt(value.bushels_per_day, 10);
        var company = value.plant_company.replace(/\W+/g, '_').toLowerCase();


        if (company == 'adm') {
            sumADM += capacity;
        }
        if (company == 'agp') {
            sumAGP += capacity;
        }
        // ... and so on for each company
    });

    console.log(sumADM, sumAGP); // and so on.

这有效,但我怎么能重构这个,这样我就不需要每个公司的sum变量和if语句?目前,sum变量和console.log()必须在循环之外才能返回正确的总数。

有更好,更紧凑的方法吗?

1 个答案:

答案 0 :(得分:3)

您可以将对象作为属性放在对象上:

var sums = {
    ADM: 0,
    AGP: 0
};

$.each(data, function (index, value) {
    var capacity = parseInt(value.bushels_per_day, 10);
    var company = value.plant_company.replace(/\W+/g, '_').toUpperCase(); // Note change here

    sums[company] += capacity;
});

console.log(sums.ADM, sums.AGP); // and so on.

或者以循环方式输出它们:

Object.keys(sums).forEach(function(company) {
    console.log(sums[company]);
});

如果公司不同,你甚至可以做懒惰的初始化:

var sums = {};

$.each(data, function (index, value) {
    var capacity = parseInt(value.bushels_per_day, 10);
    var company = value.plant_company.replace(/\W+/g, '_').toUpperCase();

    sums[company] = (sums[company] || 0) + capacity;
});

Object.keys(sums).forEach(function(company) {
    console.log(sums[company]);
});

sums[company] = (sums[company] || 0) + capacity;行的工作方式是,如果我们之前没有见过该公司,sums[company]将是undefined。由于undefined是假的,因此JavaScript curiously-powerful || operator会将右侧操作数值(0)作为结果。如果我们之前看到company并且sums[company]0,那也是如此,但是没关系,0是一个0。所有其他值(1等)都是真实的,因此sum[company] || 0将是1等等(左手操作数的值)。


附注:注意我在公司字符串上使用toUpperCase而不是toLowerCase,因此它们与属性匹配。