У меня есть два массива, один из которых содержит 200 000 объектов товаров из файла CSV, а другой содержит 200 000 объектов товаров из базы данных.
Оба массива содержат объекты с одинаковыми полями, за одним исключением: база данных объекты также имеют уникальный идентификатор.
Мне нужно сравнить все 200 000 объектов CSV с 200 000 объектов базы данных. Если объект CSV уже существует в массиве объектов базы данных, я помещаю его в массив «update» вместе с идентификатором из совпадения, а если нет, то я помещаю его в «новый» массив.
По завершении я обновляю все «обновленные» объекты в базе данных и вставляю все «новые». Это происходит быстро (несколько секунд).
Однако этап сравнения занимает несколько часов. Мне нужно сравнить три значения: канал (строка), дата (дата) и время (строка). Если все три одинаковы, это совпадение. Если это не так, то это не совпадение.
Это код, который у меня есть:
const newProducts = [];
const updateProducts = [];
csvProducts.forEach((csvProduct) => {
// check if there is a match
const match = dbProducts.find((dbProduct) => {
return dbProduct.channel === csvProduct.channel && moment(dbProduct.date).isSame(moment(csvProduct.date), 'day') && dbProduct.start_time === csvProduct.start_time;
});
if (match) {
// we found a match, add it to updateProducts array
updateProducts.push({
id: match.id,
...csvProduct
});
// remove the match from the dbProducts array to speed things up
_.pull(dbProducts, match);
} else {
// no match, it's a new product
newProducts.push(csvProduct);
}
});
Я использую библиотеки lodash
и moment.js
.
Узкое место в проверке, если есть совпадают, есть идеи, как это ускорить?