如何在React/JS中按subject字段过滤嵌套JSON数据
按Subject过滤的解决方案
你之前的问题出在email_list是一个数组,不能直接通过email_list.subject访问属性,得遍历数组里的每一封邮件来判断subject是否匹配。以下是两种常见场景的实现方案:
场景1:过滤出包含指定Subject邮件的邮箱,同时保留该邮箱下符合条件的邮件列表
这个方案会返回原邮箱结构,但只保留包含目标subject的邮箱,且该邮箱的email_list只留下匹配的邮件:
const filterBySubject = (key, data) => { // 遍历所有邮箱,处理每个邮箱的邮件列表 return data.map(mailbox => { // 过滤当前邮箱下符合subject条件的邮件 const filteredEmails = mailbox.email_list.filter(email => email.subject.includes(key) ); // 仅当有匹配邮件时,返回更新后的邮箱对象 if (filteredEmails.length > 0) { return { ...mailbox, email_list: filteredEmails }; } }).filter(Boolean); // 剔除没有匹配邮件的空项 };
场景2:直接提取所有符合Subject条件的邮件(忽略所属邮箱)
如果只需要拿到所有匹配的邮件对象,不需要保留邮箱结构,可以用这个:
const extractEmailsBySubject = (key, data) => { let matchedEmails = []; // 遍历每个邮箱,收集匹配的邮件 data.forEach(mailbox => { const matches = mailbox.email_list.filter(email => email.subject.includes(key) ); matchedEmails = [...matchedEmails, ...matches]; }); return matchedEmails; };
调用示例
假设你的原始数据是mailbox数组:
const mailboxData = [ { "mbname":"johndoe@test.ru", "email_list":[ { "recipient": "john@doe.com", "subject": "This is a test mail", "from": "info@example.com", "received": "17.08.2022", "file_name": "testfile.txt" }, { "recipient": "john@doe.com", "subject": "This is a test mail", "from": "info@example.com", "received": "17.08.2022", "file_name": ".testfile.txt" } ] } ]; // 场景1调用:返回符合条件的邮箱结构 const filteredMailboxes = filterBySubject("test mail", mailboxData); console.log(filteredMailboxes); // 场景2调用:返回所有匹配的邮件对象 const matchedEmails = extractEmailsBySubject("test mail", mailboxData); console.log(matchedEmails);
如果需要同时结合mbname和subject过滤,可以先按mbname筛选邮箱,再在筛选后的邮箱里处理邮件列表。
内容的提问来源于stack exchange,提问作者Boris
相关产品推荐
相关产品推荐

