按数组分组并在主数组中添加字段和子数组 [英] Group by array and add field and sub array in main array

查看:24
本文介绍了按数组分组并在主数组中添加字段和子数组的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个像这样的重数组:

<预><代码>[{Id: 1, Name: 'Red', optionName: 'Color'},{Id: 2, Name: 'Yellow', optionName: 'Color'},{Id: 3, Name: 'Blue', optionName: 'Color'},{Id: 4, Name: 'Green', optionName: 'Color'},{Id: 7, Name: 'Black', optionName: 'Color'},{Id: 8, Name: 'S', optionName: 'Size'},{Id: 11, Name: 'M', optionName: 'Size'},{Id: 12, Name: 'L', optionName: 'Size'},{Id: 13, Name: 'XL', optionName: 'Size'},{Id: 14, Name: 'XXL', optionName: 'Size'}]

我需要做的是将它们按 optionName 分组,并在主数组中有两行,如下所示:

<预><代码>[{名称: '颜色',数据:[{Id:1,名称:'红色'},{Id:2,名称:'黄色'},{Id: 3, Name: 'Blue'},{Id:4,名称:'绿色'},{ID:7,名称:'黑色'}]}, {名称: '尺寸',数据:[{Id:8,名称:'S'},{ID:11,名称:'M'},{ID:12,名称:'L'},{ID:13,名称:'XL'},{ID:14,名称:'XXL'}]}]

如何在javascript中做到这一点?

解决方案

这是我为这些情况写的一个片段.您可以将此功能添加到您的所有数组中:

Object.defineProperty(Array.prototype, 'group', {可枚举:假,值:功能(键){无功映射 = {};this.forEach(function (e) {var k = key(e);地图[k] = 地图[k] ||[];地图[k].push(e);});返回 Object.keys(map).map(function (k) {返回 {key: k, data: map[k]};});}});

你可以这样使用它.您可以只传递一个函数来定义您希望如何对数据进行分组.

var newArray = arr.group(function (item) {返回 item.optionName;});

工作小提琴

如果需要,可以将 {key: k, data: map[k]} 替换为 {Name: k, Data: map[k]}.

<小时>

这也是上面代码的更紧凑的ES6版本:

Object.defineProperty(Array.prototype, 'group', {可枚举:假,值:功能(键){让地图 = {};this.map(e => ({k: key(e), d: e})).forEach(e => {地图[e.k] = 地图[e.k] ||[];地图[e.k].push(e.d);});return Object.keys(map).map(k => ({key: k, data: map[k]}));}});

像这样使用它:

let newArray = arr.group(item => item.optionName))

I have a heavy array like this:

[
  {Id: 1, Name: 'Red', optionName: 'Color'}, 
  {Id: 2, Name: 'Yellow', optionName: 'Color'},
  {Id: 3, Name: 'Blue', optionName: 'Color'},
  {Id: 4, Name: 'Green', optionName: 'Color'},
  {Id: 7, Name: 'Black', optionName: 'Color'},
  {Id: 8, Name: 'S', optionName: 'Size'},
  {Id: 11, Name: 'M', optionName: 'Size'},
  {Id: 12, Name: 'L', optionName: 'Size'},
  {Id: 13, Name: 'XL', optionName: 'Size'},
  {Id: 14, Name: 'XXL', optionName: 'Size'}
]

What I need to do is to group them by optionName and have two row in the main array like this:

[
  {
    Name: 'Color',
    Data:[{Id: 1, Name: 'Red'},
          {Id: 2, Name: 'Yellow'},
          {Id: 3, Name: 'Blue'},
          {Id: 4, Name: 'Green'},
          {Id: 7, Name: 'Black'}]
  }, {
    Name: 'Size',
    Data:[{Id: 8, Name: 'S'},
          {Id: 11, Name: 'M'},
          {Id: 12, Name: 'L'},
          {Id: 13, Name: 'XL'},
          {Id: 14, Name: 'XXL'}]
  }
]

How to do it in javascript?

解决方案

This is a snippet I wrote for these kind of situations. You can add this functionality to all of your arrays:

Object.defineProperty(Array.prototype, 'group', {
  enumerable: false,
  value: function (key) {
    var map = {};
    this.forEach(function (e) {
      var k = key(e);
      map[k] = map[k] || [];
      map[k].push(e);
    });
    return Object.keys(map).map(function (k) {
      return {key: k, data: map[k]};
    });
  }
});

You can use it like this. You can just pass a function which defines how you want to group your data.

var newArray = arr.group(function (item) {
  return item.optionName;
});

Working Fiddle

If you need, you can replace {key: k, data: map[k]} with {Name: k, Data: map[k]}.


This is also more compact ES6 version of the code above:

Object.defineProperty(Array.prototype, 'group', {
  enumerable: false,
  value: function (key) {
    let map = {};
    this.map(e => ({k: key(e), d: e})).forEach(e => {
      map[e.k] = map[e.k] || [];
      map[e.k].push(e.d);
    });
    return Object.keys(map).map(k => ({key: k, data: map[k]}));
  }
});

Use it like this:

let newArray = arr.group(item => item.optionName))

这篇关于按数组分组并在主数组中添加字段和子数组的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆