JQ:利用次要数组丰富主数组并过滤价格未变更条目
解决方案
这个需求其实可以分两步高效搞定:先把次要数组转换成键值对结构方便快速查询,再遍历主数组完成筛选和字段补充。我来给你具体拆解思路和实现代码:
首先,我们可以利用reduce把次要数组转成以id为键、价格为值的对象,这样后续查找对应id的价格时不用反复遍历数组,效率会高很多。接着遍历主数组的每个元素,做以下处理:
- 如果在次要数组里找到相同id的条目:
- 对比两者价格,如果价格完全相等就跳过该条目(也就是移除价格未更新的项)
- 如果价格不一样,就给主数组的条目新增
c字段,值设为次要数组的价格
- 如果在次要数组里找不到对应id的条目,就给主数组的条目新增
c字段,值设为null
以下是具体的JavaScript实现代码:
const mainArray = [{"id":"a","p":5},{"id":"b","p":7},{"id":"c","p":8}]; const secondaryArray = [{"id":"a","p":9},{"id":"b","p":7},{"id":"d","p":4}]; // 将次要数组转为id映射价格的对象,方便快速查找 const secondaryPriceMap = secondaryArray.reduce((map, item) => { map[item.id] = item.p; return map; }, {}); // 处理主数组,生成目标结果 const finalResult = mainArray.filter(item => { const secondaryPrice = secondaryPriceMap[item.id]; // 若找到同id且价格相等,直接过滤掉该条目 if (secondaryPrice !== undefined && secondaryPrice === item.p) { return false; } // 给当前条目添加c字段,未找到则设为null item.c = secondaryPrice ?? null; return true; }); console.log(finalResult); // 输出:[{"id":"a","p":5,"c":9},{"id":"c","p":8,"c":null}]
代码细节说明:
reduce转换数组的过程是O(n)时间复杂度,只需要遍历一次次要数组filter方法同时完成了筛选(移除价格未更新项)和字段补充两个工作,避免了多次遍历主数组,逻辑更紧凑- 使用
??空值合并运算符,能简洁处理“未找到对应id”的情况,直接给c赋值为null
这样处理后就能完美得到你想要的结果啦。
内容的提问来源于stack exchange,提问作者TheChatty
相关产品推荐
相关产品推荐

