| 
	| 
	
	| 
		
	| 
			
			 
			
				10.07.2024, 18:35
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 18.01.2011 
						Сообщений: 96
					 
		
 |  |  
	| 
				Как наиболее правильно искать по массиву объектов?
			 Всем привет! Пытаюсь понять, как наиболее правильно осуществлять поиск по массиву объектов. В коде ниже два варианта, оба работают, но что-то мне подсказывает что есть более оптимальные варианты. С map и reduce еще не пробовал, у меня с ними что-то слоджности)) 
Буду очень благодарен за предложенные другие варианты, и чем они лучше представленных
 
let filter = false;
    let products = [
        {vid:"Квадрат нержавеющий", size:"150", type:"06ХН28МДТ",price:1200},
        {vid:"Круг нержавеющий", size:"11", type:"ФБ123ЧВЯ",price:300},
        {vid:"Лист нержавеющий", size:"15", type:"ZAQ987",price:2500}
    ];
    let vidValue = 'Квадрат нержавеющий';
    let sizeValue = "150";
    let typeValue = "06ХН28МДТ";
    let priceValue = 1200;
    for (let i = 0; i < 6; i++) {
       // Первый вариант
        filter = products.filter((o, i) => {
             if (o.vid != vidValue) { return false; }
             if (o.size != sizeValue) { return false; }
             if (o.type != typeValue) { return false; }
             if (o.price != priceValue) { return false; }
             return true;
        });
        filter.length ? console.log('В строке ' + i + ' совпадение ' + filter) : console.log('В строке ' + i + ' нет совпадения ' + filter );
       // Второй вариант
        filter = products.find(product => product.vid === vidValue && product.size === sizeValue && product.type === typeValue && product.price === priceValue);
        filter ? console.log('В строке ' + i + ' совпадение ' + filter) : console.log('В строке ' + i + ' нет совпадения ' + filter );
    }
			
			
	
			
			
			
			
			
				  |  |  
	| 
		
	| 
			
			 
			
				10.07.2024, 20:00
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 18.01.2011 
						Сообщений: 96
					 
		
 |  |  
	| Каждая итерация - строка таблицы, и каждую строку надо проверять, если не соответствует фильтру - удаляем |  |  
	| 
		
	| 
			
			 
			
				10.07.2024, 21:19
			
			
			
		 |  
	| 
		
			
			| Аспирант       |  | 
					Регистрация: 18.01.2011 
						Сообщений: 96
					 
		
 |  |  
	| 
	
 
	| Сообщение от Rise   |  
	| Volonter, Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
 |  
	
 Таблица - именно таблица, <table>, сначала я прохожусь по ней и собираю данные из data каждой tr строки в массив products, потом опять  идем счетчиком по ее строкам. Ну тут да, довольно сумбурно все, просто если объяснять так чтобы было понятно - портянка текста получится. Можно забить на счетчик, мне просто понять надо как правильно искать в массиве объектов |  |  
	| 
		
	| 
			
			 
			
				11.07.2024, 11:13
			
			
			
		 |  
	| 
		
			|  | CacheVar       |  | 
					Регистрация: 19.08.2010 
						Сообщений: 14,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от Volonter |  
	| Буду очень благодарен за предложенные другие варианты |  
	
 Вот такой вариант тебе подкину...
 
const products = [
	{vid:"Квадрат нержавеющий", size:"150", type:"06ХН28МДТ",price:1200},
	{vid:"Круг нержавеющий", size:"11", type:"ФБ123ЧВЯ",price:300},
	{vid:"Лист нержавеющий", size:"15", type:"ZAQ987",price:2500}
];
const q = {
	vid: 'Квадрат нержавеющий',
	size: "150",
	type: "06ХН28МДТ",
	price: 1200
}
const res = products.filter(o => Object.entries(q).every(([k, v]) => o[k] === v))
console.log(res)
 |  |  
	| 
		
	| 
			
			 
			
				11.07.2024, 11:23
			
			
			
		 |  
	| 
		
			|  | CacheVar       |  | 
					Регистрация: 19.08.2010 
						Сообщений: 14,298
					 
		
 |  |  
	| Можно еще более универсально забацать...    
const products = [
	{vid:"Квадрат нержавеющий", size:"150", type:"06ХН28МДТ",price:1200},
	{vid:"Круг нержавеющий", size:"11", type:"ФБ123ЧВЯ",price:300},
	{vid:"Лист нержавеющий", size:"15", type:"ZAQ987",price:2500}
];
const q = {
	vid: v => v.includes('нержавеющий'),
	price: v => v >1000
}
const fn = q => o => Object.entries(q).every(([k, f]) => f(o[k]))
const res = products.filter(fn(q))
console.log(res)
			 Последний раз редактировалось ksa, 11.07.2024 в 11:26.
 |  |  
	| 
		
	| 
			
			 
			
				11.07.2024, 11:31
			
			
			
		 |  
	| 
		
			|  | CacheVar       |  | 
					Регистрация: 19.08.2010 
						Сообщений: 14,298
					 
		
 |  |  
	| 
	
 
	| Сообщение от Volonter |  
	| 
filter ? console.log('В строке ' + i + ' совпадение ' + filter) : console.log('В строке ' + i + ' нет совпадения ' + filter );
 |  
	
 Имеет смысл заменить на
 
const s = 'В строке ' + i + (filter ? ' совпадение ' : ' нет совпадения ') + filter;
console.log(s)
 
Т.к. нет смысла повторять одно и то же...   |  |  
 
 
 
 |  |