Если сравнения по id
достаточно, использование Array.prototype.every()
намного эффективнее, чем использование JSON.stringify()
:
const productHasImages = images => product => (
product.images.length === images.length &&
product.images.every(
(image, i) => image.id === images[i].id
)
);
const products = [{ id: 7, name: 'product 1', description: 'description product 1', images: [{ id: 1, path: 'image1-product1.jpeg' }, { id: 2, path: 'image2-product1.jpeg' }] }, { id: 20, name: 'product 2', description: 'description product 2', images: [{ id: 3, path: 'image1-product2.jpeg' }, { id: 4, path: 'image2-product2.jpeg' }] }];
const images = [{ id: 3, path: 'image1-product2.jpeg' }, { id: 4, path: 'image2-product2.jpeg' }];
const product = products.find(productHasImages(images));
console.log(product);
Если вы хотите сопоставить независимо от порядка и вам нужно сравнить несколько свойств, то вам нужно быть немного умнее, инициализируя Map
набирается id
в закрытии:
const productHasImages = images => {
const map = new Map(
images.map(image => [image.id, image])
);
return product => (
product.images.length === images.length &&
product.images.every(
({ id, path }) => {
const image = map.get(id);
if (!image) return false;
// compare other properties here
return image.path === path;
}
)
);
};
const products = [{ id: 7, name: 'product 1', description: 'description product 1', images: [{ id: 1, path: 'image1-product1.jpeg' }, { id: 2, path: 'image2-product1.jpeg' }] }, { id: 20, name: 'product 2', description: 'description product 2', images: [{ id: 3, path: 'image1-product2.jpeg' }, { id: 4, path: 'image2-product2.jpeg' }] }];
// in different order
const images = [{ id: 4, path: 'image2-product2.jpeg' }, { id: 3, path: 'image1-product2.jpeg' }];
const product = products.find(productHasImages(images));
console.log(product);