方法一:
/**
* @description 数据分组
* @author CaoZM20132014
* @date 2019-07-19
* @export
* @param { array } array 需要进行分组的数据
* @param { string } key 进行分组时依据的键名
* @param { string } resKey 分组后数据的键名,默认为 list
* @returns { array } 一维数组形式
*/
function dataGroupingToArray(array, key, resKey = "list") {
if (!key) return array;
var aMap = [];
var aResult = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (aMap.indexOf(item[key]) === -1) {
var oItem = {};
oItem[resKey] = [item];
oItem[key] = item[key];
aResult.push(oItem);
aMap.push(item[key]);
} else {
var index = aMap.indexOf(item[key]);
aResult[index][resKey].push(item);
}
}
return aResult;
}
方法二:
/**
* @description 数据分组
* @author CaoZM20132014
* @date 2019-07-19
* @export
* @param { array } array 需要进行分组的数据
* @param { string } key 进行分组时依据的键名
* @returns { array } 二维数组形式
*/
function dataGroupingToDeepArray(array, key) {
if (!key) return array;
var aMap = [];
var aResult = [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (aMap.indexOf(item[key]) === -1) {
aResult.push([item]);
aMap.push(item[key]);
} else {
var index = aMap.indexOf(item[key]);
aResult[index].push(item);
}
}
return aResult;
}
方法三:
/**
* @description 数据分组
* @author CaoZM20132014
* @date 2019-07-19
* @export
* @param { array } array 需要进行分组的数据
* @param { string } key 进行分组时依据的键名
* @returns { object } 键值对形式
*/
function dataGroupingToJson(array, key) {
if (!key) return array;
var aMap = [];
var oResult = {};
for (var i = 0; i < array.length; i++) {
var item = array[i];
if (aMap.indexOf(item[key]) === -1) {
oResult[item[key]] = [item];
aMap.push(item[key]);
} else {
oResult[item[key]].push(item);
}
}
return oResult;
}
方法四:
/**
* @description 数据分组
* @author CaoZM20132014
* @date 2019-07-23
* @export
* @example dataGroupByKey(array, item => item.id)
* @param { array } array
* @param { function } fn
* @returns { array }
*/
function dataGroupByKey(array, fn) {
if (typeof fn !== "function") return array;
var groups = {};
var array = array || [];
for (var i = 0; i < array.length; i++) {
var item = array[i];
var group = JSON.stringify(fn(item));
groups[group] = groups[group] || [];
groups[group].push(item);
};
return Object.keys(groups).map(group => groups[group]);
}
方法五:
/**
* @description 数据分组
* @author CaoZM20132014
* @date 2019-07-22
* @export groupByKeys()
* @example dataGroupByKeys(res.data, ["id", "name"])
* @param { array } array
* @param { array } keys
* @returns { array } 键值对形式
*/
function dataGroupByKeys(array, keys) {
if (!keys) return array;
var list = array || [];
var groups = [];
for (var i = 0; i < list.length; i++) {
var item = list[i];
var key = {};
for (var j = 0; j < keys.length; j++) {
var k = keys[j];
key[k] = item[k];
}
var group = groups.find(ele => {
return ele._key === JSON.stringify(key);
});
if (!group) {
group = {
_key: JSON.stringify(key),
key: key,
};
groups.push(group);
}
group.data = group.data || [];
group.data.push(item);
};
return groups;
}
测试:
var test = [
{
"name":"张三",
"createDate":"2019-08-06",
"task": "任务未完成"
}, {
"name":"张三",
"createDate":"2019-08-06",
"task": "任务已完成"
}, {
"name":"张三",
"createDate":"2019-08-07",
"task": "任务已完成"
}, {
"name":"李四",
"createDate":"2019-08-06",
"task": "任务未完成"
}, {
"name":"李四",
"createDate":"2019-08-07",
"task": "任务未完成"
}, {
"name":"李四",
"createDate":"2019-08-07",
"task": "任务已完成"
}
]
结果如下:
dataGroupingToArray(test, "name");
dataGroupingToDeepArray(test, "name");
dataGroupingToJson(test, "createDate");
dataGroupByKey(test, item => item.createDate);
dataGroupByKeys(test, ["name", "createDate"]);