Как отфильтровать объект внутри объекта и вернуть значение?
Есть объекты. Внутри объектов есть ещё один объект. Таким образом при переборе 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. Даже если я числа ввожу или ввожу в нужном регистре. Нужно будет завтра ещё раз попробовать. Утро вечера мудренее. |
Цитата:
|
Цитата:
|
CryNet,
пара вариантов
const getValue = _ => 'zOo';
let toArrayStaff = [{'full_names' : { foo: "bar", baz: 42 }}, {'full_names' : { foo: "Zoo", baz: 42 }}];
let search = getValue("search").toUpperCase();
//toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).map(value => value.toString().toUpperCase()).includes(search));
toArrayStaff = toArrayStaff.filter(element => Object.values(element.full_names).some(value => value.toString().toUpperCase()===search));
console.log(toArrayStaff)
|
| Часовой пояс GMT +3, время: 19:46. |