Поиск отфильтрованных объектов с использованием разрешенных ключей, а также поискового значения

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

Это то, что я получил до сих пор:

    const handleSearch = (searchValue) => {
        if (searchValue !== '') {
            const allowed = ['name', 'title'];
            let list = props.search.list;

            const filtered = Object.keys(list)
              .filter((key) => allowed.includes(key))
              .reduce((obj, key) => {
                obj[key] = list[key];
                return obj;
              }, {});
            

            const filteredArray = Object.entries(filtered)


            props.search.onChange(filteredArray)
        } else {
            props.search.onChange(props.search.list)
        }
    }

Структура объекта списка:

0: {name: "John', title: 'Owner'}
1: {name: "Jane", title: 'Admin'}

Желаемые результаты:

Отфильтрованный массив, который показывает отфильтрованные ключи, а также значение поиска.

И я не знаю, куда я должен интегрировать фильтрацию по значениям. От этого последние несколько часов у меня болит голова. И надеюсь, что кто-то здесь сталкивался с такими проблемами/логикой.

Спасибо за чтение.

С уважением.

пожалуйста, добавьте некоторые данные, вызов функции и результат вместе с желаемым результатом.

Nina Scholz 19.03.2022 23:50

@NinaScholz Получает данные из базы данных. Хз как переделать. И он вызывается onChange при моем поиске. Требуемый результат: он возвращает все, что соответствует этим разрешенным ключам, и значение, которое я ввел в своем поиске.

infamous hvher 19.03.2022 23:52

Как выглядит props.search.list? Это объект?

re-za 20.03.2022 00:03

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

re-za 20.03.2022 00:06

@re-za Да, это объект, я отредактировал сообщение, чтобы показать это. И да, я хочу, чтобы он фильтровал только те ключи, которые я разрешил фильтровать, а также значение поиска

infamous hvher 20.03.2022 00:09

Я работаю над вашим кодом, но я запутался. Это объект вроде {name: "John', title: 'Owner'} или массив (или список) или подобные объекты? Почему это называется списком?

re-za 20.03.2022 00:12

@re-za Что ж, когда я печатаю его с помощью console.info, он говорит [Объект объекта], поэтому я предполагаю, что это объект. И имя переменной списка - это просто случайное имя, которое я назвал

infamous hvher 20.03.2022 00:14

Давайте продолжить обсуждение в чате.

re-za 20.03.2022 00:16
Поведение ключевого слова "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) для оценки ваших знаний,...
2
8
34
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
const handleSearch = (searchValue) => {
    if (searchValue !== '') {
        const allowed = ['name', 'title'];
        const list = props.search.list;

        const filtered = list
            .filter(obj =>
                Object.keys(obj)
                    .some(k => allowed.includes(k))
            )
            .filter(obj =>
                Object.values(obj)
                    .map(v => v.toLocaleLowerCase())
                    .some(v => v.includes(searchValue.toLowerCase()))
            )

        props.search.onChange(filtered)
    } else {
        props.search.onChange(props.search.list)
    }
}

Пример

Предположим, что props как:

const props = {
    search: {
        list: [
            { name: "John", title: 'Owner' },
            { name: "Jane", title: 'Admin' },
            { name: "Reza", title: 'Owner' }
        ],
        onChange: x => console.info(x)
    },
}
handleSearch("own")

// [ { name: 'John', title: 'Owner' }, { name: 'Reza', title: 'Owner' } ]


handleSearch("jane")

// [ { name: 'Jane', title: 'Admin' } ]


handleSearch("something")

// []

Только что попробовал это, и, похоже, он не работает, когда я ищу, ничего не появляется, и если я печатаю отфильтрованный, он просто пуст

infamous hvher 20.03.2022 00:52

Ты должен показать мне, как выглядит твой props или хотя бы props.search.list. Потому что с формой props, которую я показываю в примере выше, это работает для меня.

re-za 20.03.2022 00:53

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