JavaScript:在嵌套对象中查找目标对象并返回双方元素
解决嵌套对象中查找指定元素并返回所属顶层对象的问题
我来帮你搞定这个需求!针对你这种嵌套结构的数据,我们可以通过遍历顶层用户对象,检查每个用户的items属性里是否包含你要找的目标对象(比如books),找到后把所属的顶层用户名和目标对象的内容一起返回就行。
先准备测试数据
首先我们把你给出的示例补全,方便后续演示:
const userData = { "Peter": { "data": { "id": 104, "budget": 3400 }, "items": { "shoes": { "sales": 72, "intake": 576 }, "books": { "sales": 14, "intake": 70 } } }, "Bradley": { "data": { "id": 105, "budget": 2800 }, "items": { "clothes": { "sales": 23, "intake": 345 }, "books": { "sales": 9, "intake": 45 } } } };
方法1:查找所有匹配的结果
如果需要找出所有顶层用户下的目标对象,比如所有用户的books,可以写一个这样的函数:
function findTargetItems(data, targetKey) { const results = []; // 遍历顶层的每个用户,同时拿到用户名和对应的对象 for (const [userName, userObj] of Object.entries(data)) { // 先确保用户有items属性,且items里存在目标键,避免报错 if (userObj.items && userObj.items[targetKey]) { // 把用户名和目标对象内容存入结果数组 results.push({ owner: userName, [targetKey]: userObj.items[targetKey] }); } } return results; }
调用这个函数看看效果:
const allBooks = findTargetItems(userData, 'books'); console.log(allBooks);
输出结果会是:
[ { owner: 'Peter', books: { sales: 14, intake: 70 } }, { owner: 'Bradley', books: { sales: 9, intake: 45 } } ]
方法2:只查找第一个匹配的结果
如果你只需要第一个找到的目标对象(比如第一个有books的用户),可以修改函数,找到后直接返回:
function findFirstTargetItem(data, targetKey) { for (const [userName, userObj] of Object.entries(data)) { if (userObj.items && userObj.items[targetKey]) { return { owner: userName, [targetKey]: userObj.items[targetKey] }; } } // 没找到的话返回null,你也可以改成自定义提示 return null; }
调用示例:
const firstBook = findFirstTargetItem(userData, 'books'); console.log(firstBook);
输出结果:
{ owner: 'Peter', books: { sales: 14, intake: 70 } }
代码说明
- 使用
Object.entries(data)可以把顶层对象转换成键值对数组,让我们能同时获取到顶层用户名(键)和对应的用户对象(值)。 - 加入
userObj.items && userObj.items[targetKey]的判断,是为了避免某些用户没有items属性或者没有目标键时出现Cannot read property 'xxx' of undefined的错误。 - 返回的结果结构清晰,直接包含了所属的顶层用户名和目标对象的所有元素及值,方便你后续使用。
内容的提问来源于stack exchange,提问作者CodingBobby
相关产品推荐
相关产品推荐

