Я пытаюсь воссоздать функцию поиска 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 совпадающую строку в одном из его свойств.
Я пропустил это. Позвольте мне просмотреть это.
Мой вопрос совсем другой. В моем случае речь идет о динамическом/рекурсивном циклическом переборе вложенного объекта и возврате обратно только компонентов электронной почты, если вложенный объект электронной почты имеет совпадение в одном из своих свойств.
Раздел «Что делать, если имена свойств динамические и я их заранее не знаю?» описывает динамический доступ. Раздел «Что делать, если «глубина» структуры данных мне неизвестна?» описывает рекурсивный доступ. Вернуть только компоненты электронной почты можно с помощью простого map
. Это также описано в другом вопросе.
Этот вопрос: stackoverflow.com/questions/8085004/… является наиболее близким к тому, что я нашел, но все еще не описывает, как вернуть объект в его форме, а в моем случае отфильтровать только объекты электронной почты.
Вы спрашиваете, как решить такие проблемы, или хотите, чтобы кто-то написал за вас код? Концепция описана во всех этих вопросах. Как программист, вы не ищете точный код, который решит вашу проблему. Вы пытаетесь понять концепции и написать собственное решение.
Я хотел бы увидеть ответ, объединяющий эти два вопроса. Это не обязательно должны быть мои точные интерфейсы, а упрощенный подход. Создание поиска/фильтра по вложенному объекту и возврат в формате исходного вложенного объекта с отфильтрованными элементами.
Я обновил вопрос, включив в него более конкретный запрос.
Эти функции помогут
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
};
}
Не могли бы вы дать альтернативный ответ, используя подход, показывающий функцию, возвращающую объект папки с электронными письмами, ограниченными отфильтрованными, как вы это сделали? Ваш ответ работает прекрасно, но если бы я в конце концов решил показать папки, мне пришлось бы поддерживать структуру объекта, но электронные письма фильтровались.
Этот вопрос похож на: Как я могу получить доступ и обработать вложенные объекты, массивы или JSON?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.