如何校验日期数组值是否存在于对象数组并提取对应值生成新数组
日期数组匹配销售额生成结果数组实现
处理规则
- 遍历日期范围选择得到的日期数组,逐个校验日期是否存在于目标订单对象列表中,按以下规则生成新数组:
- 当前日期不存在于对象列表中时,向新数组推入
0 - 当前日期存在于对象列表中时,找到日期匹配的对应对象,提取其
sale_amount字段值推入新数组
- 当前日期不存在于对象列表中时,向新数组推入
示例输入
const dateArray1 = ['2022-02-03','2022-02-04','2022-02-05','2022-02-06','2022-02-07','2022-02-08'] const objArray2 = { "orders":[ { "id": 4419830775973, "sale_amount" :200, 'date':'2022-02-03' }, { "id": 44198340775973, "sale_amount" :100, 'date':"2022-02-05" }, { "id": 4419660775973, "sale_amount" :700, 'date':'2022-02-08' }, ] }
实现代码
高性能写法(推荐,适配大数据量场景)
先把订单列表转为日期到销售额的映射,避免每次遍历日期都重复扫描整个订单列表,时间复杂度更低:
// 构建日期-销售额映射 const saleValueMap = new Map( objArray2.orders.map(orderItem => [orderItem.date, orderItem.sale_amount]) ) // 遍历日期数组生成结果 const newArray = dateArray1.map(date => saleValueMap.get(date) ?? 0)
简化写法(适配小数据量场景)
数据量小时直接用find匹配即可,代码更简洁:
const newArray = dateArray1.map(date => { const matched = objArray2.orders.find(order => order.date === date) return matched ? matched.sale_amount : 0 })
运行结果
最终生成的
newArray输出为:[200, 0, 100, 0, 0, 700],和预期结果完全一致。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

