按数组分组并在主数组中添加字段和子数组 [英] Group by array and add field and sub array in main array
问题描述
我有一个像这样的重数组:
<预><代码>[{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
分组,并在主数组中有两行,如下所示:
如何在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;
});
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屋!