Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 10.07.2024, 18:35
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 90

Как наиболее правильно искать по массиву объектов?
Всем привет! Пытаюсь понять, как наиболее правильно осуществлять поиск по массиву объектов. В коде ниже два варианта, оба работают, но что-то мне подсказывает что есть более оптимальные варианты. С 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 );
    }
Ответить с цитированием
  #2 (permalink)  
Старый 10.07.2024, 18:56
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,671

Сообщение от Volonter
for (let i = 0; i < 6; i++)
А зачем 6 раз одно и тоже делать?
Ответить с цитированием
  #3 (permalink)  
Старый 10.07.2024, 20:00
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 90

Каждая итерация - строка таблицы, и каждую строку надо проверять, если не соответствует фильтру - удаляем
Ответить с цитированием
  #4 (permalink)  
Старый 10.07.2024, 20:17
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,671

Volonter,
Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
Ответить с цитированием
  #5 (permalink)  
Старый 10.07.2024, 21:19
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 90

Сообщение от Rise Посмотреть сообщение
Volonter,
Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
Таблица - именно таблица, <table>, сначала я прохожусь по ней и собираю данные из data каждой tr строки в массив products, потом опять идем счетчиком по ее строкам. Ну тут да, довольно сумбурно все, просто если объяснять так чтобы было понятно - портянка текста получится. Можно забить на счетчик, мне просто понять надо как правильно искать в массиве объектов
Ответить с цитированием
  #6 (permalink)  
Старый 10.07.2024, 21:40
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,671

Сообщение от Volonter
потом опять идем счетчиком по ее строкам
Вам не надо этого делать. Строки таблицы это индексы массива. Массив итерируется методом filter(), этого достаточно, он обходит все строки, и отбирает все совпадения, просто сохраняйте i куда-нибудь. А метод find() здесь не подходит, он ищет только первое попавшееся совпадение.

Последний раз редактировалось Rise, 10.07.2024 в 21:43.
Ответить с цитированием
  #7 (permalink)  
Старый 11.07.2024, 11:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,157

Сообщение от 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)
Ответить с цитированием
  #8 (permalink)  
Старый 11.07.2024, 11:23
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,157

Можно еще более универсально забацать...

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.
Ответить с цитированием
  #9 (permalink)  
Старый 11.07.2024, 11:31
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,157

Сообщение от Volonter
filter ? console.log('В строке ' + i + ' совпадение ' + filter) : console.log('В строке ' + i + ' нет совпадения ' + filter );
Имеет смысл заменить на

const s = 'В строке ' + i + (filter ? ' совпадение ' : ' нет совпадения ') + filter;
console.log(s)


Т.к. нет смысла повторять одно и то же...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как правильно организовать подключение скриптов? s24344 Общие вопросы Javascript 0 31.12.2018 11:53
Как правильно подключить стили в webpack? s24344 Сборка проекта, утилиты 0 08.11.2018 09:00
Пасоны, как правильно парсить параметры? megaupload Оффтопик 15 05.05.2013 14:44
Как правильно прицепить обработку события slowklg Events/DOM/Window 6 15.03.2012 16:20
Как правильно очистить maxlength в input? Маэстро Events/DOM/Window 10 22.06.2011 18:14