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

如何提取数组中的数字?将嵌套数组转为一维数组的实现方法

问题描述

我需要得到形如[1,2,3]的一维数字数组,而非[0:[1], 1:[2]]的嵌套结构数组。但我写的JavaScript代码输出不符合预期,请问怎么实现需求?

代码如下:

const usersWhoHavePurchasedYourCourses = usersWhoHaveTokens.filter(
(user1: any) => {
  return user1.tokens
    ?.map((token: any) => parseInt(token.course_id))
    .includes(user.courses?.map((course: any) => course.id));
});
解决方案

你的代码有两个核心问题:

  1. filter方法返回的是符合条件的用户对象数组,不是你要的ID数组,类型完全不符;
  2. includes里传入的是数组(user.courses.map的结果),但你用它去匹配数字数组里的元素,永远返回false,逻辑错误。

根据你的需求,分两种场景给出实现:

场景1:直接提取所有购买过你课程的course_id(一维数组)

// 先把你的课程ID转成Set,提升查找效率
const yourCourseIds = new Set(user.courses?.map(course => course.id) || []);

// 用flatMap直接展开嵌套的token数组,提取course_id后筛选出属于你的课程
const purchasedCourseIds = usersWhoHaveTokens.flatMap(user1 => 
  user1.tokens?.map(token => parseInt(token.course_id)) || []
).filter(courseId => yourCourseIds.has(courseId));

// 如需去重(同一课程被多个用户购买),用Set处理
const uniquePurchasedIds = [...new Set(purchasedCourseIds)];

场景2:先筛选出购买过你课程的用户,再提取对应course_id

const yourCourseIds = new Set(user.courses?.map(course => course.id) || []);

// 筛选出购买过你任意课程的用户
const targetUsers = usersWhoHaveTokens.filter(user1 => {
  const userCourseIds = user1.tokens?.map(token => parseInt(token.course_id)) || [];
  // 判断用户是否购买过你的任意一门课程
  return userCourseIds.some(id => yourCourseIds.has(id));
});

// 从筛选后的用户中提取所有符合条件的course_id,组成一维数组
const purchasedCourseIds = targetUsers.flatMap(user1 => 
  user1.tokens?.map(token => parseInt(token.course_id)) || []
).filter(id => yourCourseIds.has(id));

关键方法说明

  • flatMap:同时完成映射和扁平化,直接把嵌套的数组转成一维结构,避免出现[0:[1], 1:[2]]这种嵌套格式;
  • Set:存储你的课程ID,has方法的查找速度远快于数组includes,数据量大时优势明显;
  • some:判断数组中是否存在符合条件的元素,正确实现“用户是否购买过你的课程”的判断逻辑。

内容的提问来源于stack exchange,提问作者Updater XD

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 17:01:26