如何遍历JSON文件将股票股东userId替换为对应人员姓名
问题排查
第一版代码错误原因
- 最终返回值
arr初始化为单个对象而非数组,无法存储所有股票的处理结果,每次循环都会覆盖arr的属性,最终仅保留最后一条处理后的股票数据 - 在内层股东循环中每次都重新初始化
shareholders = [],会清空之前已匹配到的同股票下的其他股东,导致单支股票下仅保留最后一个匹配成功的股东 - 三层循环嵌套逻辑冗余,匹配效率极低
第二版代码错误原因
- 你将
return b写在了forEach的回调函数内部,forEach的回调返回值会被直接忽略,且listShareholders函数本身没有在外层返回处理后的股票数组,最终函数返回值为undefined - 没有对
person为空的边界场景做兼容,当userId匹配不到对应人的时候会出现属性读取错误
正确实现方案
优化点:提前将人员数组转换为以id为key的映射表,避免每次匹配都遍历整个人员数组,匹配效率从O(n*m)提升到O(n)
require("util").inspect.defaultOptions.depth = null; const axios = require('axios'); async function getPeople(){ const { data } = await axios.get('https://gist.githubusercontent.com/graffixnyc/a1196cbf008e85a8e808dc60d4db7261/raw/9fd0d1a4d7846b19e52ab3551339c5b0b37cac71/people.json') return data } async function getStocks(){ const { data } = await axios.get('https://gist.githubusercontent.com/graffixnyc/8c363d85e61863ac044097c0d199dbcc/raw/7d79752a9342ac97e4953bce23db0388a39642bf/stocks.json') return data } async function listShareholders(){ const peopleList = await getPeople(); const stockList = await getStocks(); // 生成人员id映射表,提升匹配效率 const peopleMap = new Map(peopleList.map(p => [p.id, p])); // 遍历处理每支股票 return stockList.map(stock => { // 处理当前股票的股东列表 const handledShareholders = stock.shareholders.map(holder => { const person = peopleMap.get(holder.userId); // 匹配不到的情况做兜底,可根据需求调整是否保留 if (!person) return null; return { first_name: person.first_name, last_name: person.last_name, number_of_shares: holder.number_of_shares }; }).filter(Boolean); // 过滤掉匹配失败的空值 // 返回处理后的股票对象 return { ...stock, shareholders: handledShareholders }; }); } async function bc(){ const result = await listShareholders() console.log(result) } bc()
内容的提问来源于stack exchange,提问作者Swayam Shah
相关产品推荐
相关产品推荐

