对嵌套数组进行分组

时间:2015-01-27 06:42:23

标签: javascript jquery d3.js

Fiddle Example

我有一个由nest方法生成的数组d3.js任何人都可以通过values建议使用javascript / jQuery方法对category属性中的对象进行分组吗?

var data = [
  {
    "key": "0",
    "values": [
      {
        "category": "phone",
        "brand": "Sony",
        "brand_id": "0",
        "name": "item A",
        "id": "551",
        "point": "600"
      },
      {
        "category": "software",
        "brand": "Sony",
        "brand_id": "0",
        "name": "item D",
        "id": "51",
        "point": "800"
      },
      {
        "category": "phone",
        "brand": "Sony",
        "brand_id": "0",
        "name": "item E",
        "id": "52",
        "point": "1800"
      }
    ]
  },
  {
    "key": "0",
    "values": [
      {
        "category": "software",
        "brand": "Microsoft",
        "brand_id": "1",
        "name": "item B",
        "id": "54",
        "point": "800"
      },
      {
        "category": "phone",
        "brand": "Microsoft",
        "brand_id": "1",
        "name": "item B",
        "id": "60",
        "point": "200"
      },
      {
        "category": "phone",
        "brand": "Microsoft",
        "brand_id": "1",
        "name": "item T",
        "id": "30",
        "point": "600"
      },
      {
        "category": "software",
        "brand": "Microsoft",
        "brand_id": "1",
        "name": "item N",
        "id": "90",
        "point": "500"
      }
    ]
  }
];

这是一个理想的结果:

[
  {
    "key": "0",
    "values": [
      {
        "phone": [
          {
            "category": "phone",
            "brand": "Sony",
            "brand_id": "0",
            "name": "item A",
            "id": "551",
            "point": "600"
          },
          {
            "category": "phone",
            "brand": "Sony",
            "brand_id": "0",
            "name": "item E",
            "id": "52",
            "point": "1800"
          }
        ],
        "software": [
          {
            "category": "software",
            "brand": "Sony",
            "brand_id": "0",
            "name": "item D",
            "id": "51",
            "point": "800"
          }
        ]
      }
    ]
  },
  {
    "key": "0",
    "values": [
      {
        "phone": [
          {
            "category": "phone",
            "brand": "Microsoft",
            "brand_id": "0",
            "name": "item B",
            "id": "80",
            "point": "54"
          },
          {
            "category": "phone",
            "brand": "Microsoft",
            "brand_id": "0",
            "name": "item D",
            "id": "52",
            "point": "1800"
          }
        ],
        "software": [
          {
            "category": "software",
            "brand": "Microsoft",
            "brand_id": "0",
            "name": "item G",
            "id": "41",
            "point": "800"
          },
          {
            "category": "software",
            "brand": "Microsoft",
            "brand_id": "0",
            "name": "item L",
            "id": "42",
            "point": "900"
          }
        ]
      }
    ]
  }
]

以下代码不起作用。我想这是因为grouped[t.category] = []是在每个循环中定义的。前一项将被最后一项覆盖。如果我没有定义它,我会得到一个grouped[t.category]未定义的错误:

grouped = {};
data.forEach(function(d){
  d.values.map(function(t){ 
     grouped[t.category] = [];       
     grouped[t.category].push({name:t.name,tid:t.id,point:parseInt(t.point)});
   })
})

4 个答案:

答案 0 :(得分:2)

您可以使用lodash或类似的库

以这种方式解决此问题
_.map(data, function(x){
  return _.assign({}, x, {values: _.groupBy(x.values, 'category')})
})

Fiddle

答案 1 :(得分:1)

试试这个

var grouped;

data.forEach(function(d) {
    grouped = {};

    d.values.forEach(function(t) {
         if (!grouped[t.category]) {
             grouped[t.category] = [];
         }

         grouped[t.category].push({
             name:  t.name,
             tid:   t.id, 
             point: parseInt(t.point)
         });
     })

    d.values = grouped;
});

Example

答案 2 :(得分:1)

你可以试试这个: jsfiddle

var result = data.map(function ( record ) {
    return {
        key:    record.key,
        values: [ groupBy( 'category', record.values ) ]
    };
})

function groupBy ( key, arr ) {
    var groups = {};
    arr.forEach(function ( el ) {
        var keyVal = el[ key ];
        if ( !keyVal ) return;

        if ( groups[ keyVal ] )
            groups[ keyVal ].push( el );
        else
            groups[ keyVal ] = [ el ];
    });
    return groups;
}

答案 3 :(得分:1)

我熟悉underscore.js

var desireResult = _.map(data, function(obj){
    obj.values = _.groupBy(obj.values, 'category');
    return obj;
});

希望它会对你有所帮助!