费不多说, 先上代码
Array.prototype.groupBy = function(group){
return group && typeof group==='function'?Array.prototype.reduce.call(this, function(c, v){
var k = group(v);
if(c.hasOwnProperty(k)){
c[k].push(v);
} else {
c[k] = [v];
}
return c;
},{}):this;
}
测试数据
var arr = [
{code: "1", language: "2", content: "3"},
{code: "1", language: "2", content: "4"},
{code: "1", language: "3", content: "5"},
{code: "1", language: "3", content: "6"},
{code: "2", language: "1", content: "3"},
{code: "2", language: "2", content: "3"},
{code: "1", language: "2", content: "4"}
]
使用 arr.groupBy(it=>it.code) 进行分组. 测试结果:
写这个是因为在 groovy 中的列表里有 这个方法, 然后发现 js 里面竟然没有. 然后就仿造 groovy 里的用法弄了一个. 嘻嘻, 仅供学习.
另外, 中间的 if-else 可替换为
c[k] = (c[k]||[]).concat(v);
感兴趣的可以试试.
另另外, 这里提供一份多层分组的代码, 虽然没什么用, 但还是希望能给大家提供一点帮助.
Array.prototype.groupByMulti = function(...group){
const head = group.length?group[0]:(it)=>it;
// 这里调用了上面的 groupBy 方法
let first = Array.prototype.groupBy.call(this, head);
if (group.length<2){
return first;
}
const [, ...tail] = group
const acc = {};
for (let [k,v] of Object.entries(first)) {
acc[k] = Array.prototype.groupByMulti.apply(v, tail)
}
return acc;
}