![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 18:35
|
Аспирант
|
|
Регистрация: 18.01.2011
Сообщений: 92
|
|
Как наиболее правильно искать по массиву объектов?
Всем привет! Пытаюсь понять, как наиболее правильно осуществлять поиск по массиву объектов. В коде ниже два варианта, оба работают, но что-то мне подсказывает что есть более оптимальные варианты. С 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 );
}
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 18:56
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,671
|
|
Сообщение от Volonter
|
for (let i = 0; i < 6; i++)
|
А зачем 6 раз одно и тоже делать?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 20:00
|
Аспирант
|
|
Регистрация: 18.01.2011
Сообщений: 92
|
|
Каждая итерация - строка таблицы, и каждую строку надо проверять, если не соответствует фильтру - удаляем
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 20:17
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,671
|
|
Volonter,
Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 21:19
|
Аспирант
|
|
Регистрация: 18.01.2011
Сообщений: 92
|
|
Сообщение от Rise
|
Volonter,
Какая таблица? Судя по коду, filter() делает итерации по таблице products. А вы о чем?
|
Таблица - именно таблица, <table>, сначала я прохожусь по ней и собираю данные из data каждой tr строки в массив products, потом опять идем счетчиком по ее строкам. Ну тут да, довольно сумбурно все, просто если объяснять так чтобы было понятно - портянка текста получится. Можно забить на счетчик, мне просто понять надо как правильно искать в массиве объектов
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
10.07.2024, 21:40
|
Профессор
|
|
Регистрация: 07.11.2013
Сообщений: 4,671
|
|
Сообщение от Volonter
|
потом опять идем счетчиком по ее строкам
|
Вам не надо этого делать. Строки таблицы это индексы массива. Массив итерируется методом filter(), этого достаточно, он обходит все строки, и отбирает все совпадения, просто сохраняйте i куда-нибудь. А метод find() здесь не подходит, он ищет только первое попавшееся совпадение.
Последний раз редактировалось Rise, 10.07.2024 в 21:43.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
11.07.2024, 11:13
|
![Аватар для ksa](https://javascript.ru/forum/image.php?u=8616&dateline=1282216923) |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,196
|
|
Сообщение от 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)
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
11.07.2024, 11:23
|
![Аватар для ksa](https://javascript.ru/forum/image.php?u=8616&dateline=1282216923) |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,196
|
|
Можно еще более универсально забацать...
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.
|
|
![Старый](/forum/images/ca_serenity/statusicon/post_old.gif)
11.07.2024, 11:31
|
![Аватар для ksa](https://javascript.ru/forum/image.php?u=8616&dateline=1282216923) |
CacheVar
|
|
Регистрация: 19.08.2010
Сообщений: 14,196
|
|
Сообщение от Volonter
|
filter ? console.log('В строке ' + i + ' совпадение ' + filter) : console.log('В строке ' + i + ' нет совпадения ' + filter );
|
Имеет смысл заменить на
const s = 'В строке ' + i + (filter ? ' совпадение ' : ' нет совпадения ') + filter;
console.log(s)
Т.к. нет смысла повторять одно и то же... ![](https://javascript.ru/forum/images/smilies/wink.gif)
|
|
|
|