You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 13:09:00