как видно из моего заголовка, я столкнулся с проблемой, которая требует решения. Я пытаюсь отфильтровать свой объект, но не только по ключам. Но также на основе значения разрешенных ключей.
Это то, что я получил до сих пор:
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'}
Желаемые результаты:
Отфильтрованный массив, который показывает отфильтрованные ключи, а также значение поиска.
И я не знаю, куда я должен интегрировать фильтрацию по значениям. От этого последние несколько часов у меня болит голова. И надеюсь, что кто-то здесь сталкивался с такими проблемами/логикой.
Спасибо за чтение.
С уважением.
@NinaScholz Получает данные из базы данных. Хз как переделать. И он вызывается onChange при моем поиске. Требуемый результат: он возвращает все, что соответствует этим разрешенным ключам, и значение, которое я ввел в своем поиске.
Как выглядит props.search.list
? Это объект?
Вы имеете в виду, что объект filtered
должен быть отфильтрован не только по ключам, которые находятся в allowed
, но и по значению этих ключей? Но каким условиям должны удовлетворять эти ценности?
@re-za Да, это объект, я отредактировал сообщение, чтобы показать это. И да, я хочу, чтобы он фильтровал только те ключи, которые я разрешил фильтровать, а также значение поиска
Я работаю над вашим кодом, но я запутался. Это объект вроде {name: "John', title: 'Owner'}
или массив (или список) или подобные объекты? Почему это называется списком?
@re-za Что ж, когда я печатаю его с помощью console.info, он говорит [Объект объекта], поэтому я предполагаю, что это объект. И имя переменной списка - это просто случайное имя, которое я назвал
Давайте продолжить обсуждение в чате.
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")
// []
Только что попробовал это, и, похоже, он не работает, когда я ищу, ничего не появляется, и если я печатаю отфильтрованный, он просто пуст
Ты должен показать мне, как выглядит твой props
или хотя бы props.search.list
. Потому что с формой props
, которую я показываю в примере выше, это работает для меня.
пожалуйста, добавьте некоторые данные, вызов функции и результат вместе с желаемым результатом.