JS对数组中的对象按相同值进行分组,随机推荐两条数据

392 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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)