Как отфильтровать объект внутри объекта и вернуть значение?
Есть объекты. Внутри объектов есть ещё один объект. Таким образом при переборе toArrayStaff у нас получается:
toArrayStaff - переменная с объектами toArrayStaff.element - конкретный объект при переборе методом filter, например toArrayStaff.element.full_names - тоже объект, в котором нужно найти совпадение Если внутри full_names есть совпадение по искомому слову, то я должен вернуть element сохранив его исключительно в toArrayStaff (по сути просто отфильтровав лишние). Я пробую так: toArrayStaff = toArrayStaff.filter(element => { const allName = Object.values(element.full_names) // преобразовываем в массив значения объекта allName.filter(name => { // ищем строку в подстроке if ( name.indexOf("имя") !== -1 ) { return element // вот тут ещё есть отфильтрованные значения } }) return element // а вот тут уже нет - возвращаются абсолютно все без учёта перебора allName }) На выхлопе получается тот же самый объект, как будь-то его и не фильтровали. |
Я накостылил такую залипуху:
toArrayStaff = toArrayStaff.filter(element => { let allName = Object.values(element.full_names) let isTrue = false allName.filter(name => { if ( name.indexOf(getValue("search")) !== -1 ) { isTrue = true } }) if (isTrue) { return element } isTrue = false }) Выглядит ужасно, но это работает как нужно, вроде бы. Надеюсь у кого-то появиться более адекватное решение. |
CryNet,
const search = getValue("search"); toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).includes(search)); |
Цитата:
|
рони,ещё вопрос. Вы не подскажите как также красиво привести в верхнему регистру, чтобы перебирать массив 1 раз. Я пробую так:
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).some(el => el.toUpperCase() === getValue("search").toUpperCase()) ); Возвращается пустой массив. el.toUpperCase() и getValue("search").toUpperCase()) в верхнем регистре как и положено. |
CryNet,
число в фильтрации есть? |
CryNet,
преобразование в строку добавьте el.toString().toUpperCase() === getValue("search").toString().toUpperCase() |
Ишак заупрямится с выполнением. :)
|
Цитата:
Я пробую смотреть как там дела: .some(el => console.log( el == getValue("search")) ) А у меня тут везде false. Даже если я числа ввожу или ввожу в нужном регистре. Нужно будет завтра ещё раз попробовать. Утро вечера мудренее. |
Цитата:
|
Часовой пояс GMT +3, время: 22:06. |