Как перебрать вложенный объект JSON, который содержит объекты и массивы объектов

Я пытаюсь воссоздать функцию поиска Outlook. Весь мой набор данных содержится в следующих интерфейсах:

export interface Folder{
    id: string | null;
    name: string;
    folders: Folder[] | null;
    emails: Email[]
}

export interface Email {
    id : string;
    conversation_id: string;
    from: Contact;
    to: Contact[];
    cc: Contact[];
    bcc: Contact[];
    subject: string;
    body: string;
    body_preview: string;
    has_attachments: boolean;
    file_attachments: FileAttachment[];
    received_date: Date
}

export interface Contact
{
    email_address : number;
    name : string | null;
}

export interface FileAttachment
{
    id: string;
    file_name: string;
    content_type: string;
    content_bytes: string;
}

Как видите, это сложный объект с несколькими слоями и неизвестной глубиной, поскольку папки могут содержать больше папок и больше электронных писем. У меня есть следующее поле v-text, которое я буду использовать для поиска строк во вложенном объекте:

            <v-text-field
        v-model = "search"
        append-inner-icon = "mdi-magnify"
        label = "Dynamic Search"
        density = "compact"
        variant = "outlined"
        clearable
        rounded
        hide-details
        single-line
        flat
        color = "primaryDarken4"/> 

Я хочу увидеть ответ, который покажет, как поддерживать эту структуру объектов, но отфильтровывает электронные письма до тех, которые содержат по крайней мере 1 совпадающую строку в одном из его свойств.

Этот вопрос похож на: Как я могу получить доступ и обработать вложенные объекты, массивы или JSON?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

jabaa 03.07.2024 23:05

Я пропустил это. Позвольте мне просмотреть это.

Qiuzman 03.07.2024 23:08

Мой вопрос совсем другой. В моем случае речь идет о динамическом/рекурсивном циклическом переборе вложенного объекта и возврате обратно только компонентов электронной почты, если вложенный объект электронной почты имеет совпадение в одном из своих свойств.

Qiuzman 03.07.2024 23:15

Раздел «Что делать, если имена свойств динамические и я их заранее не знаю?» описывает динамический доступ. Раздел «Что делать, если «глубина» структуры данных мне неизвестна?» описывает рекурсивный доступ. Вернуть только компоненты электронной почты можно с помощью простого map. Это также описано в другом вопросе.

jabaa 03.07.2024 23:16

Этот вопрос: stackoverflow.com/questions/8085004/… является наиболее близким к тому, что я нашел, но все еще не описывает, как вернуть объект в его форме, а в моем случае отфильтровать только объекты электронной почты.

Qiuzman 03.07.2024 23:17

Вы спрашиваете, как решить такие проблемы, или хотите, чтобы кто-то написал за вас код? Концепция описана во всех этих вопросах. Как программист, вы не ищете точный код, который решит вашу проблему. Вы пытаетесь понять концепции и написать собственное решение.

jabaa 03.07.2024 23:19

Я хотел бы увидеть ответ, объединяющий эти два вопроса. Это не обязательно должны быть мои точные интерфейсы, а упрощенный подход. Создание поиска/фильтра по вложенному объекту и возврат в формате исходного вложенного объекта с отфильтрованными элементами.

Qiuzman 03.07.2024 23:22

Я обновил вопрос, включив в него более конкретный запрос.

Qiuzman 03.07.2024 23:26
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
8
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Эти функции помогут

 function filterEmails(emailData: Email, searchTerm: string): boolean {
    const searchTermLwCase = searchTerm.toLowerCase();
    return (
        emailData.subject.toLowerCase().includes(searchTermLwCase) ||
        emailData.body.toLowerCase().includes(searchTermLwCase) ||
        emailData.body_preview.toLowerCase().includes(searchTermLwCase) ||
        emailData.from.name?.toLowerCase().includes(searchTermLwCase) ||
        emailData.to.some(contact => contact.name?.toLowerCase().includes(searchTermLwCase)) ||
        emailData.cc.some(contact => contact.name?.toLowerCase().includes(searchTermLwCase)) ||
        emailData.bcc.some(contact => contact.name?.toLowerCase().includes(searchTermLwCase))
    );
}

function searchForEmails(folder: Folder, searchTerm: string): Folder {
    // emails filtered from current folder
    const filteredEmails = folder.emails.filter(email => filterEmails(email, searchTerm));

    // subfolder filter recursively
    const filteredFolders = folder.folders ? folder.folders.map(subfolder => searchFolders(subfolder, searchTerm)).filter(subfolder => subfolder.emails.length > 0 || (subfolder.folders && subfolder.folders.length > 0)) : [];

   
    return {
        ...folder,
        emails: filteredEmails,
        folders: filteredFolders
    };
}

Не могли бы вы дать альтернативный ответ, используя подход, показывающий функцию, возвращающую объект папки с электронными письмами, ограниченными отфильтрованными, как вы это сделали? Ваш ответ работает прекрасно, но если бы я в конце концов решил показать папки, мне пришлось бы поддерживать структуру объекта, но электронные письма фильтровались.

Qiuzman 03.07.2024 23:37

Другие вопросы по теме