Показать сообщение отдельно
  #11 (permalink)  
Старый 05.01.2021, 00:49
Аватар для sovsem-nub
Профессор
Отправить личное сообщение для sovsem-nub Посмотреть профиль Найти все сообщения от sovsem-nub
 
Регистрация: 15.10.2014
Сообщений: 255

Сообщение от рони Посмотреть сообщение
sovsem-nub,

[...getUsersByKeyValue(users, "eyeColor", "blue"), ...getUsersByKeyValue(users, "eyeColor", "green")]
то есть я складываю цвет глаз и ищу "пересечение" массива глаз с женщинами? https://jsfiddle.net/zip13/oc29phwx/22/
или другая логика?

//Получить массив объектов пользователей по цвету глаз (поле 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;
}, []);
}
Ответить с цитированием