如何提取数组中的数字?将嵌套数组转为一维数组的实现方法
问题描述
我需要得到形如[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)); });
解决方案
你的代码有两个核心问题:
filter方法返回的是符合条件的用户对象数组,不是你要的ID数组,类型完全不符;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
相关产品推荐
相关产品推荐

