如何从JavaScript对象数组中随机选取catId=1的2个条目及其他分类各1个条目
实现方案
核心思路
先对原数组按catId分组,再按规则从对应分组随机抽取指定数量条目后合并即可,完整可运行代码如下:
// 原数组 const arr1 = [ { 'catId': 1, 'name': 'A' }, { 'catId': 2, 'name': 'B' }, { 'catId': 3, 'name': 'C' }, { 'catId': 2, 'name': 'D' }, { 'catId': 1, 'name': 'E' }, { 'catId': 1, 'name': 'F' }, { 'catId': 3, 'name': 'G' }, { 'catId': 3, 'name': 'H' }, { 'catId': 2, 'name': 'I' }, { 'catId': 1, 'name': 'J' } ] // 工具函数:从数组中随机抽取n个不重复元素 function getRandomItems(arr, n) { // 复制原数组避免修改原数据 const temp = [...arr] const result = [] for (let i = 0; i < n && temp.length > 0; i++) { const randomIndex = Math.floor(Math.random() * temp.length) result.push(temp.splice(randomIndex, 1)[0]) } return result } // 1. 按catId分组 const groupByCat = arr1.reduce((acc, item) => { if (!acc[item.catId]) acc[item.catId] = [] acc[item.catId].push(item) return acc }, {}) // 2. 按规则抽取元素 const arr2 = [] // catId=1抽2个 arr2.push(...getRandomItems(groupByCat[1], 2)) // 其他catId各抽1个 Object.keys(groupByCat).forEach(catId => { if (Number(catId) !== 1) { arr2.push(...getRandomItems(groupByCat[catId], 1)) } }) console.log(arr2)
代码说明
- 分组用
reduce实现,全程不会修改原数组数据 - 随机抽取函数通过复制临时数组+
splice移除已抽取元素,保证不会抽到重复条目 - 如果对应catId下的元素数量不足指定抽取数量,函数会自动返回现有所有可用元素,不会抛出异常
- 如果后续需要调整各分类的抽取数量,直接修改
getRandomItems的第二个参数即可
内容的提问来源于stack exchange,提问作者Rrptm
相关产品推荐
相关产品推荐

