сравнить два массива объектов и вернуть элемент - PullRequest
1 голос
/ 02 апреля 2020

У меня есть массив объектов, который выглядит примерно так:

let 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",
        }
      ]
     }
  ]

У каждого продукта есть массив изображений, мне нужно сравнить это расположение изображений, с тем, которое я получу в качестве параметра и которое будет выглядеть точно так же, как один из них, узнать, к какому продукту он принадлежит, и вернуть этот товар. например, если я получу этот массив:

[
  {
    "id": 3,
    "path": "image1-product2.jpeg",
  },
  {
    "id": 4,
    "path": "image2-product2.jpeg",
  }
]

равен массиву изображений продукта 2, так как я могу сравнить их и вернуть этот продукт?

Ответы [ 3 ]

2 голосов
/ 02 апреля 2020

Если порядок не имеет значения и можно сделать предположение, что все id и путь совпадают и должны быть точными ... Тогда вы можете просто сравнить stringify каждого массива. Если вам нужен более расслабленный comapre, то вам нужно еще больше добавить в массивы l oop и сравнить отдельные значения.

let 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",
      }
    ]
   }
]

let incoming = [
  {
    "id": 3,
    "path": "image1-product2.jpeg",
  },
  {
    "id": 4,
    "path": "image2-product2.jpeg",
  }
]

let result = null
result = products.find(product => {
  return JSON.stringify(product.images) === JSON.stringify(incoming)
})

console.log(result)
2 голосов
/ 02 апреля 2020

Если сравнения по 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);
0 голосов
/ 02 апреля 2020

Если я правильно понял. Вы получите объект, содержащий идентификатор и изображение. Этот объект находится внутри одного из изображений продуктов где-то, и вы хотите найти / вернуть продукт, содержащий это изображение?

Если это так, вы можете объединить прототип массива .find, чтобы найти объект, передающий условие ( одно из изображений, которое вы предоставляете)

let 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 compare = (imageObjToFind) => {
  return products.find(product => product.images.find(image => JSON.stringify(image) === JSON.stringify(imageObjToFind)))
}

const IwantToCompareThis = {
  "id": 4,
  "path": "image2-product2.jpeg",
}

console.log(compare(IwantToCompareThis))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...