0

我有这样的 JSON 数据

[
{"attributes":{"SHAPELEN":26.2293318917963,"CITYID":2061}},
{"attributes":{"SHAPELEN":16.9352548253636,"CITYID":2062}},
{"attributes":{"SHAPELEN":22.101151804600597,"CITYID":2063}},
{"attributes":{"SHAPELEN":22.8809188858315,"CITYID":2061}},
{"attributes":{"SHAPELEN":18.6906905910402,"CITYID":2063}},
{"attributes":{"SHAPELEN":31.322932493622,"CITYID":2062}},
{"attributes":{"SHAPELEN":10.5580020747299,"CITYID":2063}},
]

我想按 CITYID 对这些数据进行分组,并像这样对 SHAPELEN 求和。

[
{CITYID:2061, TOTAL=49.1},
{CITYID:2062, TOTAL=47.2},
{CITYID:2063, TOTAL=51,34}
]

我创建了一个 javascript 函数,但没有按我的意愿工作。

function gropData(data) {
    var features = data.features;
    var cities = [];

    $.each(features, function (index, item) {
        // **if cities not include item, add in cities. But if not working here**
        if (!$.inArray(item.attributes, cities) ) { 
            cities.push(item.attributes);
        }

    });
 }

有没有你看到的解决方案?

4

3 回答 3

0

$.inArray()是一个名字很糟糕的函数。它不返回布尔值,如果在数组中找到该项目的索引,则返回该项目的索引,如果未找到该项目,则返回 -1。因此,如果未找到某个项目,则检查真实性将返回 true。如果该项目是数组中的第一个,它将评估为 false。

你需要这样做:

if ($.inArray(item.attributes, cities) < 0) {
    // item not found
    cities.push(item.attributes);
}

if ($.inArray(item.attributes, cities) == -1) {如果您更容易阅读/理解,也可以使用。

于 2013-07-19T14:24:33.200 回答
0

您不能在数组中搜索对象值,您要么需要遍历数组以手动检查每个对象,要么使用 jQuery 的 $.grep 函数。此外,上面的 JSON 对象中不存在 data.features ,您可能只想对数据本身执行 $.each 。

    var result = $.grep(cities, function(e){ return e.CITYID == item.attributes.CITYID; });
    if(result.length == 0){
        var tempItem = { CITYID : item.attributes.CITYID, TOTAL : item.attributes.SHAPELEN };
        cities.push(tempItem);
    }else{
        result[0].TOTAL += item.attributes.SHAPELEN;
    }
于 2013-07-19T15:14:28.813 回答
0

也是一个纯 JavaScript 版本:

function groupData(data) {
  var cities = [];
  data.forEach(function(datum) {
    var cityEntry,
        attr = datum.attributes;
    cities.some(function(city) {
      if (city.CITYID === attr.CITYID) {
        cityEntry = city;
        return true;
      }});

    if (cityEntry) {
      cityEntry.TOTAL += attr.SHAPELEN;
    } else {
      cities.push({CITYID: attr.CITYID, 
                   TOTAL: attr.SHAPELEN});
    }
  });
  return cities;
}
于 2013-07-19T15:26:36.700 回答