js 数据分组(单个分组依据或多个分组依据)

方法一:

/**
 * @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"]);

在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值