Выборка из массива объектов при помощи filter.
Добрый день!
Замылился глаз и не вижу где ошибка... Нужно из массива объектов вытащить список объектов которые перебирает метод filter учитывая условие callback функции. Помогите пожалуйста. Код привожу. const users = [ { id: "701b29c3-b35d-4cf1-a5f6-8b12b29a5081", name: "Moore Hensley", email: "moorehensley@indexia.com", eyeColor: "blue", phone: "+1 (848) 556-2344", friends: ["Sharron Pace"], isActive: false, balance: 2811, skills: ["ipsum", "lorem"], gender: "male", age: 37 }, { id: "7a3cbd18-57a1-4534-8e12-1caad921bda1", name: "Sharlene Bush", email: "sharlenebush@tubesys.com", eyeColor: "blue", phone: "+1 (855) 582-2464", friends: ["Briana Decker", "Sharron Pace"], isActive: true, balance: 3821, skills: ["tempor", "mollit", "commodo", "veniam", "laborum"], gender: "female", age: 34 }, { id: "88beb2f3-e4c2-49f3-a0a0-ecf957a95af3", name: "Ross Vazquez", email: "rossvazquez@xinware.com", eyeColor: "green", phone: "+1 (814) 593-3825", friends: ["Marilyn Mcintosh", "Padilla Garrison", "Naomi Buckner"], isActive: false, balance: 3793, skills: ["nulla", "anim", "proident", "ipsum", "elit"], gender: "male", age: 24 }, { id: "249b6175-5c30-44c6-b154-f120923736f5", name: "Elma Head", email: "elmahead@omatom.com", eyeColor: "green", phone: "+1 (909) 547-2687", friends: ["Goldie Gentry", "Aisha Tran"], isActive: true, balance: 2278, skills: ["adipisicing", "irure", "velit"], gender: "female", age: 21 }, { id: "334f8cb3-eb04-45e6-abf4-4935dd439b70", name: "Carey Barr", email: "careybarr@nurali.com", eyeColor: "blue", phone: "+1 (956) 512-2693", friends: ["Jordan Sampson", "Eddie Strong"], isActive: true, balance: 3951, skills: ["ex", "culpa", "nostrud"], gender: "male", age: 27 }, { guid: "150b00fb-dd82-427d-9faf-2879ea87c695", name: "Blackburn Dotson", email: "blackburndotson@furnigeer.com", eyeColor: "brown", phone: "+1 (876) 411-2433", friends: ["Jacklyn Lucas", "Linda Chapman"], isActive: false, balance: 1498, skills: ["non", "amet", "ipsum"], gender: "male", age: 38 }, { id: "e1bf46ab-7168-491e-925e-f01e21394812", name: "Sheree Anthony", email: "shereeanthony@kog.com", eyeColor: "brown", phone: "+1 (979) 504-2554", friends: ["Goldie Gentry", "Briana Decker"], isActive: true, balance: 2764, skills: ["lorem", "veniam", "culpa"], gender: "female", age: 39 } ]; //Получить массив объектов пользователей по цвету глаз (поле eyeColor) const getUsersByEyeColor = (arr, color) => arr.filter(user => user.eyeColor.color); console.log(getUsersByEyeColor(users, "blue")); |
AndriiS,
user => user.eyeColor == color |
рони,
Большое спасибо! Очень помогли :-) Хотел еще спросить, можно ли при помощи console.log выводить результат работы скрипта в консоль был через запятую. Имена объектов из полей name подставляются в вывод. Хотел просто сделать более читабельно. [объект Moore Hensley, объект Ross Vazquez, объект Blackburn Dotson] Подскажите пожалуйста хотя-бы где про это почитать, я допилю самостоятельно. |
AndriiS,
:-? const getUsersByEyeColor = (arr, color) => arr.filter(user => user.eyeColor == color); let arrFilter = getUsersByEyeColor(users, "blue") console.log(arrFilter.map(el => el.name)); |
Цитата:
console.log("объект", arrFilter.map(el => el.name)); Реально ли получить в консоли вот это? [объект Moore Hensley, объект Sharlene Bush, объект Carey Barr] |
Подскажите пожалуйста, если нужно выбрать массив пользователей из массива объектов users у которых есть друг (ключ friends) с указанным именем. Т.е. нужно вывести console.log(getUsersByFriend(users, "Briana Decker"));
Каким функциональным методом массивов (map, find, filter...) это лучше делать? Спасибо! |
Цитата:
console.log(arrFilter.map(el => 'Объект '+el.name)); Цитата:
|
фильтрация обьекта
Цитата:
const getUsersByKeyValue = (arr, key, value) => arr.filter(user => (user = user[key], Array.isArray(user) ? user.includes(value) : user == value)); let arrFilter = getUsersByKeyValue(users, "friends", "Briana Decker"); console.log(arrFilter.map(el => 'Объект '+el.name)); arrFilter = getUsersByKeyValue(users, "eyeColor", "blue"); console.log(arrFilter.map(el => 'Объект '+el.name)); |
Цитата:
|
sovsem-nub,
Цитата:
[...getUsersByKeyValue(users, "eyeColor", "blue"), ...getUsersByKeyValue(users, "eyeColor", "green")] |
Цитата:
или другая логика? //Получить массив объектов пользователей по цвету глаз (поле eyeColor) const getUsersByKeyValue = (arr, key, value) => arr.filter(user => (user = user[key], Array.isArray(user) ? user.includes(value) : user == value)); //let arrFilter = getUsersByKeyValue(users, "friends", "Briana Decker"); //console.log(arrFilter.map(el => el.name)); arrFilter = getUsersByKeyValue(users, "eyeColor", "blue"); arrFilter2 = getUsersByKeyValue(users, "eyeColor", "green"); arrFilter3 = getUsersByKeyValue(users, "gender", "female"); var args2=[]; args2.push((arrFilter.map(el => el.name)).concat(arrFilter2.map(el => el.name))); args2.push(arrFilter3.map(el => el.name)); console.log(intersect(args2)); function intersect(args){ if(args.length == 0) return []; // for optimisation lets find the smallest array var imin = 0; for(var i = 1; i < args.length; i++) if(args[i].length < args[imin].length) imin = i; var smallest = Array.prototype.splice.call(args, imin, 1)[0]; return smallest.reduce(function(a, e){ for(var i = 0; i < args.length; i++) if(args[i].indexOf(e) == -1) return a; a.push(e); return a; }, []); } |
const filterByObj = (arr, obj) => arr.filter(v => Object.keys(obj).every(key => (v.hasOwnProperty(key) && obj[key].includes(v[key])))); console.log(filterByObj(users, {gender: ["female"], eyeColor: ["blue", "green"]})); вариант фильтра еще вариант в строку const filterByObj = (a, o) => a.filter(v => Object.keys(o).every(k => k in v && o[k].includes(v[k]))); console.log(filterByObj(users, {gender: ["female"], eyeColor: ["blue", "green"]})); |
sovsem-nub,
arrFilter = getUsersByKeyValue(users, "eyeColor", "blue"); arrFilter2 = getUsersByKeyValue(users, "eyeColor", "green"); arrFilter3 = getUsersByKeyValue([...arrFilter, ...arrFilter2], "gender", "female"); |
Цитата:
Чтобы закончить, как найти всех зеленоглазых и голубоглазых женщин от 20 до 25 лет? |
Цитата:
<!DOCTYPE html> <html> <head> <title>Untitled</title> <meta charset="utf-8"> <style type="text/css"> </style> </head> <body> <ul class="list"></ul> <script> const users = [ { id: "701b29c3-b35d-4cf1-a5f6-8b12b29a5081", name: "Moore Hensley", email: "moorehensley@indexia.com", eyeColor: "blue", phone: "+1 (848) 556-2344", friends: ["Sharron Pace"], isActive: false, balance: 2811, skills: ["ipsum", "lorem"], gender: "male", age: 37 }, { id: "7a3cbd18-57a1-4534-8e12-1caad921bda1", name: "Sharlene Bush", email: "sharlenebush@tubesys.com", eyeColor: "blue", phone: "+1 (855) 582-2464", friends: ["Briana Decker", "Sharron Pace"], isActive: true, balance: 3821, skills: ["tempor", "mollit", "commodo", "veniam", "laborum"], gender: "female", age: 34 }, { id: "88beb2f3-e4c2-49f3-a0a0-ecf957a95af3", name: "Ross Vazquez", email: "rossvazquez@xinware.com", eyeColor: "green", phone: "+1 (814) 593-3825", friends: ["Marilyn Mcintosh", "Padilla Garrison", "Naomi Buckner"], isActive: false, balance: 3793, skills: ["nulla", "anim", "proident", "ipsum", "elit"], gender: "male", age: 24 }, { id: "249b6175-5c30-44c6-b154-f120923736f5", name: "Elma Head", email: "elmahead@omatom.com", eyeColor: "green", phone: "+1 (909) 547-2687", friends: ["Goldie Gentry", "Aisha Tran"], isActive: true, balance: 2278, skills: ["adipisicing", "irure", "velit"], gender: "female", age: 21 }, { id: "334f8cb3-eb04-45e6-abf4-4935dd439b70", name: "Carey Barr", email: "careybarr@nurali.com", eyeColor: "blue", phone: "+1 (956) 512-2693", friends: ["Jordan Sampson", "Eddie Strong"], isActive: true, balance: 3951, skills: ["ex", "culpa", "nostrud"], gender: "male", age: 27 }, { guid: "150b00fb-dd82-427d-9faf-2879ea87c695", name: "Blackburn Dotson", email: "blackburndotson@furnigeer.com", eyeColor: "brown", phone: "+1 (876) 411-2433", friends: ["Jacklyn Lucas", "Linda Chapman"], isActive: false, balance: 1498, skills: ["non", "amet", "ipsum"], gender: "male", age: 38 }, { id: "e1bf46ab-7168-491e-925e-f01e21394812", name: "Sheree Anthony", email: "shereeanthony@kog.com", eyeColor: "brown", phone: "+1 (979) 504-2554", friends: ["Goldie Gentry", "Briana Decker"], isActive: true, balance: 2764, skills: ["lorem", "veniam", "culpa"], gender: "female", age: 39 } ]; function arrayFilter(arr, pattern) { return arr.filter(function(el) { return pattern.some(function(mask) { return Object.keys(mask).every(function(key) { return mask[key](el[key]) }) }) }) }; let pattern = [{ eyeColor : eyeColor => ['green', 'blue'].includes(eyeColor), gender : gender => gender === 'female', age: age => age >= 20 && age <= 25 } ], usersFilter = arrayFilter(users, pattern), html = usersFilter.reduce(function(html, el) { return html += '<li class="item" ><pre>'+JSON.stringify(el, null, 4)+'</pre></li>' },""); console.log() document.querySelector(".list").innerHTML = html; </script> </body> </html> |
а по skills как искать? Там массив.
Как я понимаю так не совсем правильно eyeColor : f => f.indexOf( 'green'|| 'blue' ) != -1 , skills : f => f.indexOf( 'velit'|| 'culpa' ) != -1 ,age: f => f >= 20 && f <= 25 indexOf сработает и на строке и на массиве, но в строке может быть greennnnn, и это тоже будет считаться совпадением. |
Цитата:
Цитата:
skills : f => ['velit', 'culpa'].includes(f) pattern это массив -- можно искать одновременно людей с разными параметрами. pattern = [{gender : gender => gender === 'female'...}, {gender : gender => gender === 'male', ...}, {} ...] |
Цитата:
|
Цитата:
eyeColor : a => ['green', 'blue'].some(f => a.indexOf(f) != -1) , skills : a => ['velit','culpa'].some(f => a.indexOf(f) != -1) ,age: f => f >= 20 && f <= 25 нашел ["Elma Head"] заменил ей глаза с green на greennnnn, опять нашел ["Elma Head"] а если делать оба с icludes, то не сработает на skills, так как там массив. хочется универсальную функцию на строку и массив и чтобы различало green и greennnn или нужно проверять if arr.... indexof, else... includes? если все покидать в массивы eyeColor: ["green"] , тогда indexof отработает корректно. или хранить только строки и через запятую несколько вариантов, и делать для всех .split(",") |
Цитата:
const isContains = (a1, a2) => { if (!Array.isArray(a1)) a1 = [a1]; if (!Array.isArray(a2)) a2 = [a2]; return a1.some(v => a2.includes(v)); } console.log(isContains(1, 1)); console.log(isContains(1, 2)); console.log(isContains([1, 2], [5, 1])); console.log(isContains([1, 2], [5, 3])); |
:)
const isContains = (...a) => { const [a1, a2] = a.map(a =>[a].flat()); return a1.some(v => a2.includes(v)); } console.log(isContains(1, 1)); console.log(isContains(1, 2)); console.log(isContains([1, 2], [5, 1])); console.log(isContains([1, 2], [5, 3])); |
Часовой пояс GMT +3, время: 19:33. |