Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как отфильтровать объект внутри объекта и вернуть значение? (https://javascript.ru/forum/misc/80622-kak-otfiltrovat-obekt-vnutri-obekta-i-vernut-znachenie.html)

CryNet 02.07.2020 13:11

Как отфильтровать объект внутри объекта и вернуть значение?
 
Есть объекты. Внутри объектов есть ещё один объект. Таким образом при переборе 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
        })

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

CryNet 02.07.2020 13:26

Я накостылил такую залипуху:
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
        })

Выглядит ужасно, но это работает как нужно, вроде бы. Надеюсь у кого-то появиться более адекватное решение.

рони 02.07.2020 14:55

CryNet,
const search = getValue("search");
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).includes(search));

CryNet 02.07.2020 16:17

Цитата:

Сообщение от рони (Сообщение 526683)
CryNet,
const search = getValue("search");
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).includes(search));

Спасибо большое за адекватное решение. Плюсик поставить не могу - слишком часто вы мне помогаете :)

CryNet 02.07.2020 16:43

рони,ещё вопрос. Вы не подскажите как также красиво привести в верхнему регистру, чтобы перебирать массив 1 раз. Я пробую так:

toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).some(el => el.toUpperCase() === getValue("search").toUpperCase()) );

Возвращается пустой массив. el.toUpperCase() и getValue("search").toUpperCase()) в верхнем регистре как и положено.

рони 02.07.2020 17:04

CryNet,
число в фильтрации есть?

рони 02.07.2020 17:08

CryNet,
преобразование в строку добавьте
el.toString().toUpperCase() === getValue("search").toString().toUpperCase()

laimas 02.07.2020 17:23

Ишак заупрямится с выполнением. :)

CryNet 02.07.2020 17:41

Цитата:

Сообщение от рони (Сообщение 526691)
CryNet,
преобразование в строку добавьте
el.toString().toUpperCase() === getValue("search").toString().toUpperCase()

Число может быть. Не работает. Не срабатывает проверка при переборе методом some.

Я пробую смотреть как там дела:
.some(el => console.log( el  == getValue("search")) )

А у меня тут везде false. Даже если я числа ввожу или ввожу в нужном регистре. Нужно будет завтра ещё раз попробовать. Утро вечера мудренее.

CryNet 02.07.2020 17:43

Цитата:

Сообщение от laimas (Сообщение 526692)
Ишак заупрямится с выполнением. :)

К частью на IE можно забить. А что, подвисает просто?


Часовой пояс GMT +3, время: 18:26.