 
			
				05.01.2021, 00:49
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 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;
}, []);
}
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				05.01.2021, 01:49
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 13.03.2013 
					
					
					
						Сообщений: 1,572
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
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"]}));
 
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось Vlasenko Fedor, 05.01.2021 в 02:12.
				Причина: добавил вариант в строку
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				05.01.2021, 02:00
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		sovsem-nub,
  
arrFilter = getUsersByKeyValue(users, "eyeColor", "blue");
arrFilter2 = getUsersByKeyValue(users, "eyeColor", "green");
arrFilter3 = getUsersByKeyValue([...arrFilter, ...arrFilter2], "gender", "female");
  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				05.01.2021, 10:02
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 15.10.2014 
					
					
					
						Сообщений: 255
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от Vlasenko Fedor
			 
		
	 | 
 
	
		вариант фильтра 
еще вариант в строку 
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"]}));
	 | 
 
	
 
 Спасибо. узнал про filter  и про три точки для объединения массивов... 
Чтобы закончить, как найти всех зеленоглазых  и голубоглазых женщин от 20 до 25 лет?  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				05.01.2021, 10:38
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от sovsem-nub
			
		
	 | 
 
	| 
		как найти всех зеленоглазых и голубоглазых женщин от 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>
 
		
	
		
		
		
		
		
		
	
		
			
			
	
			
			
			
			
			
				 
			
			
			
			
			
			
				
			
			
			
		 
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2021, 10:49
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 15.10.2014 
					
					
					
						Сообщений: 255
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		а по skills как искать? Там массив. 
Как я понимаю так не совсем правильно
 
eyeColor : f => f.indexOf( 'green'|| 'blue' ) != -1 , skills : f => f.indexOf( 'velit'|| 'culpa' ) != -1 ,age: f =>  f >= 20 && f <= 25
 
indexOf сработает и на строке и на массиве, но в строке может быть greennnnn, и это тоже будет считаться совпадением.  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2021, 11:15
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от sovsem-nub
			
		
	 | 
 
	| 
		 как искать?
	 | 
 
	
 
 
	
 
	| 
		
			Сообщение от рони
			
		
	 | 
 
	| 
		eyeColor : eyeColor => ['green', 'blue'].includes(eyeColor),
	 | 
 
	
 
 
skills : f => ['velit', 'culpa'].includes(f)
 
pattern это массив -- можно искать одновременно людей с разными параметрами. 
pattern = [{gender : gender => gender === 'female'...}, {gender : gender => gender === 'male', ...}, {} ...]  
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2021, 11:22
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 27.05.2010 
					
					
					
						Сообщений: 33,150
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	| 
		
			Сообщение от sovsem-nub
			
		
	 | 
 
	| 
		в строке может быть greennnnn,
	 | 
 
	
 
 eyeColor : a => ['green', 'blue'].some(f => a.indexOf(f) != -1), 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2021, 13:12
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 15.10.2014 
					
					
					
						Сообщений: 255
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от рони
			 
		
	 | 
 
	| 
		eyeColor : a => ['green', 'blue'].some(f => a.indexOf(f) != -1),
	 | 
 
	
 
 написал так
 
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(",")  
		
	
		
		
		
		
		
		
		
						  
				
				Последний раз редактировалось sovsem-nub, 06.01.2021 в 13:50.
				
				
			
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
	
	
	
		
	
		
		
		
			
			 
			
				06.01.2021, 14:44
			
			
			
		  
	 | 
 
	
		
		
		
			  | 
			
			
				
				
				 Профессор 
				
				
				
				
	
 
 
 
			 | 
			  | 
			
				
				
					Регистрация: 13.03.2013 
					
					
					
						Сообщений: 1,572
					 
					
					
			
		
 
		 
		
			 | 
		 
		 
		
	 | 
 
	
	
	
		
		
		
		
		
	
 
	
		
			Сообщение от sovsem-nub
			 
		
	 | 
 
	| 
		хочется универсальную функцию на строку и массив
	 | 
 
	
 
 вариант
 
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]));
 
		
	
		
		
		
		
		
		
	
		
		
	
	
	 | 
 
 
	 
		 | 
 
 
 
 |  
  |