JS使用for in遍历对象调用find匹配数据返回undefined如何解决
问题分析
- for...in 遍历对象时,迭代得到的变量是对象的属性名字符串,不是属性对应的实际值。你代码中
post的取值是"comment"、"comments_text"、"handle"这类字符串,字符串不存在comments_text属性,所以if (post.comments_text)分支永远不会触发,item始终为undefined。 - 即使正确拿到
comments_text的属性值,也不需要调用Object.values()处理:comments_text本身就是需要匹配的单个对象,不是对象集合,Object.values()会把它拆解为各个属性的字符串值,没有key字段可供匹配。
修正代码
const commentId = "-MlaKXBMXzXIBJMsZQNX" const objectToLoop = { comment: false, comments_text: { commenter_comment: "reedwe", commenter_handle: "FALCON1", commenter_uid: "ZALb0B3wZEWjfdFIUOxteJRl9Xu1", key: "-MlaKXBMXzXIBJMsZQNX" }, handle: "TURTLE1", key: "-MkeOOUboKdOcC3Sannl", title: "hello2" } function returnMatchingComment(commentIdKey) { let item; // 先判断对象是否存在comments_text属性 if (objectToLoop.hasOwnProperty('comments_text')) { const commentObj = objectToLoop.comments_text; // 直接匹配key字段 if (commentObj.key === commentIdKey) { item = commentObj; } } return item } console.log( returnMatchingComment(commentId) )
运行结果
{ commenter_comment: "reedwe", commenter_handle: "FALCON1", commenter_uid: "ZALb0B3wZEWjfdFIUOxteJRl9Xu1", key: "-MlaKXBMXzXIBJMsZQNX" }
如果你的实际场景中objectToLoop是嵌套的对象集合,需要遍历外层的多个post对象,可使用下方遍历逻辑:
// 假设objectToLoop是多个post组成的对象,需要遍历每个post function returnMatchingComment(commentIdKey) { let item; for (const postKey in objectToLoop) { const post = objectToLoop[postKey]; // 取post的实际值 if (post.comments_text) { if (post.comments_text.key === commentIdKey) { item = post.comments_text; break; } } } return item }
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

