如何在两个嵌套对象数组中匹配属性并优化find()实现?
问题分析与优化方案
原代码的问题
你嵌套使用find()没得到结果的核心原因是:内层find()的回调函数没有返回比较结果。内层回调里只写了specificAnswer.id === value.key;,但没有return这个表达式的值,所以内层find()每次都返回undefined,外层find()自然找不到符合条件的项。
优化实现方案
直接嵌套find()的效率很低(时间复杂度O(n*m)),更高效的做法是先把bar中的所有key提取到一个Set中(查找时间复杂度O(1)),再去answers里匹配:
// 先提取bar中的所有key到Set,实现快速查找 const barKeys = new Set(myObj.bar.map(item => item.key)); // 在answers中找到id匹配bar中key的项 const matchedAnswer = myObj.answers.find(answer => barKeys.has(answer.id)); // 处理可能找不到的情况,避免报错 const result = matchedAnswer ? matchedAnswer.foo : '未找到匹配项'; console.log(result); // 输出: 1
优化优势
- 性能更优:当
answers和bar数组较大时,Set的查找效率远高于每次遍历数组,时间复杂度从O(n*m)降到O(n+m)。 - 代码更清晰:逻辑拆分后,可读性更强,也更容易维护。
- 容错性更好:增加了找不到匹配项时的处理,避免直接访问
.foo导致Cannot read properties of undefined错误。
原代码的快速修复(不推荐,仅作对比)
如果一定要用嵌套find(),只需要给内层回调加上return即可,但依然不推荐这种低效率写法:
const matchedAnswer = myObj.answers.find((specificAnswer) => myObj.bar.find((value) => { return specificAnswer.id === value.key; // 加上return }) ); const result = matchedAnswer ? matchedAnswer.foo : '未找到匹配项'; console.log(result);
内容的提问来源于stack exchange,提问作者Enrique GF
相关产品推荐
相关产品推荐

