本文已参与「新人创作礼」活动,一起开启掘金创作之路。
JS/TS 对数组中的对象按相同值进行分组
写个js文件,util.js
一、JS写法
const sortClass = (sortData) => {
const groupBy = (array, f) => {
let groups = {};
array.forEach((o) => {
let group = JSON.stringify(f(o));
groups[group] = groups[group] || [];
groups[group].push(o);
});
return Object.keys(groups).map((group) => {
return groups[group];
});
};
const sorted = groupBy(sortData, (item) => {
return item.groupId; // 返回需要分组的对象
});
return sorted;
};
// 分组前
console.log(listData);
// 分组后
console.log(sortClass(listData));
二、TS 写法
const sortClass = (sortData: ListDataItem[]) => {
const groupBy = (array: ListDataItem[], f: Function) => {
const groups: {
[key: string]: ListDataItem[],
} = {};
array.forEach((item) => {
const group = JSON.stringify(f(item));
groups[group] = groups[group] || [];
groups[group].push(item);
});
return Object.keys(groups).map((group) => {
return groups[group];
});
};
const sorted = groupBy(sortData, (item: ListDataItem) => {
return item.groupId;//需要筛选相同值的参数
});
return sorted;
};
// 分组前
console.log(listData);
// 分组后
console.log(sortClass(listData));
以上为封装JS方法
举个例子:对以下数组按 groupId 的值进行分组分类
分组前后输出内容
随机推荐两条数据筛选规则
-
1、通过groupId进行数据分组,得到几个分组列表
-
2、取courseInfo的列表大小的值进行数据,得到一个随机整数
-
3、根据2.2得到的随机数,在2.1中去对应的分组列表
-
4、在得到2.1的分组列表中,再随机去两个数据(随机数参考2.2,只不过随机数最大值不能超过分组列表的size)
-
5、显示随机的两个数据
下面为调用使用方法
import { sortClass } from './util.js'//引入文件sortClass方法
// banner
const banner = info.courseInfo//该数据输出为上图分组前未处理数据
// 根据上面所列规则随机推荐2个数据
const arr = sortClass(banner)//调用sortClass方法,arr为处理后数据
const randomarrIndex = Math.floor(Math.random() * Number(sortClass(banner).length))
console.info('-------------------', randomarrIndex, arr[randomarrIndex])
const randomNum = []
const bannerArr = []
for (let i = 0; i < 2; i++) {
const num = Math.floor(Math.random() * Number(arr[randomarrIndex].length))
if (randomNum.indexOf(num) === -1) {
randomNum.push(num)
} else {
i--
}
}
console.info('随机去重两位数===', randomNum)
const array = arr[randomarrIndex]
randomNum.forEach(item => {
bannerArr.push(array[item])
})
courseRecommData.groupId = Number(bannerArr[0].groupId)
console.info('groupId=====', courseRecommData.groupId)