Как уже упоминалось в комментариях, использование Reduce сохраняет сложность на O (n) . По сути, это означает, что список, вдвое превышающий размер, займет вдвое больше времени, поскольку алгоритм только один раз повторяет список автомобилей.
Если вам нужно сравнить каждый элемент в массиве cars с другим элементом в массиве cars, сложность с циклическими подходами будет ne O (n ^ 2) , как и для каждого дополнительного элемента (грубо говоря) будет использоваться экспоненциально больше циклов / времени.
Я не на 100% уверен в структуре данных ваших объектов javascript, но следующий подход должен работать:
const allCars = []; // An array of cars, each item is a HTMLElement
let matchedCars = allCars.reduce((acc, car, cars) => {
cars.forEach(car2 => {
// For every car iterate over the cars array again to compare car to every item in the cars array (leave out this loop if you don't need the extensive comparison)
if (car.hasAttribute("data-original-price")
&& car2.getAttribute("data-original-price") === car.getAttribute("data-price")
/* Add additional matching criteria here, you may access cars to get info about other cars than the current car */) {
// Add the desired class for a match
car.classList.add('listing-prepaid');
// Add the matched car to the accumulator, so it ends up in the matchedCars array
acc.push(car);
}
});
}, [];
Альтернативным подходом было бы создание структуры данных, которая обеспечивает доступ к элементам на основе их атрибутов в постоянное время ( O (1) ). Примером может служить (Hash) Map . В этом случае для каждого элемента, над которым зацикливается алгоритм, необязательно повторять цикл по всему списку снова, чтобы идентифицировать совпадения, но запрашивать структуру Map на совпадения.
Бонус: Учитывая, что car является HTMLElement, вы можете использовать свойство dataset для доступа к данным - * значения проще с:
car.dataset.originalPrice === car.dataset.price
Подробнее об этом можно узнать на https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes
Общие источники: https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement, https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce