Javascript.RU

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

Как наиболее правильно искать по массиву объектов?
Всем привет! Пытаюсь понять, как наиболее правильно осуществлять поиск по массиву объектов. В коде ниже два варианта, оба работают, но что-то мне подсказывает что есть более оптимальные варианты. С 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, 20:00
Аспирант
Отправить личное сообщение для Volonter Посмотреть профиль Найти все сообщения от Volonter
 
Регистрация: 18.01.2011
Сообщений: 93

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

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

Сообщение от Rise Посмотреть сообщение
Volonter,
Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
Таблица - именно таблица, <table>, сначала я прохожусь по ней и собираю данные из data каждой tr строки в массив products, потом опять идем счетчиком по ее строкам. Ну тут да, довольно сумбурно все, просто если объяснять так чтобы было понятно - портянка текста получится. Можно забить на счетчик, мне просто понять надо как правильно искать в массиве объектов
Ответить с цитированием
  #5 (permalink)  
Старый 11.07.2024, 11:13
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,225

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

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

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

Сообщение от 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