Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 02.07.2020, 13:11
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Как отфильтровать объект внутри объекта и вернуть значение?
Есть объекты. Внутри объектов есть ещё один объект. Таким образом при переборе 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:14.
Ответить с цитированием
  #2 (permalink)  
Старый 02.07.2020, 13:26
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

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

Выглядит ужасно, но это работает как нужно, вроде бы. Надеюсь у кого-то появиться более адекватное решение.
Ответить с цитированием
  #3 (permalink)  
Старый 02.07.2020, 14:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

CryNet,
const search = getValue("search");
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).includes(search));
Ответить с цитированием
  #4 (permalink)  
Старый 02.07.2020, 16:17
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от рони Посмотреть сообщение
CryNet,
const search = getValue("search");
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).includes(search));
Спасибо большое за адекватное решение. Плюсик поставить не могу - слишком часто вы мне помогаете
Ответить с цитированием
  #5 (permalink)  
Старый 02.07.2020, 16:43
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

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

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

Возвращается пустой массив. el.toUpperCase() и getValue("search").toUpperCase()) в верхнем регистре как и положено.
Ответить с цитированием
  #6 (permalink)  
Старый 02.07.2020, 17:04
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

CryNet,
число в фильтрации есть?
Ответить с цитированием
  #7 (permalink)  
Старый 02.07.2020, 17:08
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,126

CryNet,
преобразование в строку добавьте
el.toString().toUpperCase() === getValue("search").toString().toUpperCase()
Ответить с цитированием
  #8 (permalink)  
Старый 02.07.2020, 17:23
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,989

Ишак заупрямится с выполнением.
Ответить с цитированием
  #9 (permalink)  
Старый 02.07.2020, 17:41
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от рони Посмотреть сообщение
CryNet,
преобразование в строку добавьте
el.toString().toUpperCase() === getValue("search").toString().toUpperCase()
Число может быть. Не работает. Не срабатывает проверка при переборе методом some.

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

А у меня тут везде false. Даже если я числа ввожу или ввожу в нужном регистре. Нужно будет завтра ещё раз попробовать. Утро вечера мудренее.
Ответить с цитированием
  #10 (permalink)  
Старый 02.07.2020, 17:43
Профессор
Отправить личное сообщение для CryNet Посмотреть профиль Найти все сообщения от CryNet
 
Регистрация: 02.01.2019
Сообщений: 151

Сообщение от laimas Посмотреть сообщение
Ишак заупрямится с выполнением.
К частью на IE можно забить. А что, подвисает просто?
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как нарисовать объект в консоли newbieJStart Общие вопросы Javascript 0 12.04.2020 10:06
async/await как получить вернуть значение из функции dpts Events/DOM/Window 7 02.04.2020 09:56
как правильно обращаться к свойствам объект внутри самого объекта ? mitiya Общие вопросы Javascript 12 25.04.2015 21:18
jQuery (Как открыть объект в этом же окне, щёлкнув по нему мышкой) Объект кусок карты hadzhimuratov (X)HTML/CSS 32 18.06.2012 17:54
Можно ли в геттере вернуть значение объекта, на который геттер повесили? FINoM Общие вопросы Javascript 2 10.05.2012 19:18