Combinez deux tableaux après avoir utilisé la méthode de filtrage


9

Je suis bloqué en montrant la page du panier où les produits sont répertoriés et qui ont été ajoutés au panier par les utilisateurs. J'ai deux tableaux: un avec les détails du produit.

productDetails: [
            {
              productID: 1,
              productTitle: 'Product Title 1',
              productPrice: 2000
            },
            {
              productID: 2,
              productTitle: 'Product Title 2',
              productPrice: 5000
            },
            {
              productID: 3,
              productTitle: 'Product Title 3',
              productPrice: 1000
            },
            {
              productID: 4,
              productTitle: 'Product Title 4',
              productPrice: 10000
            }
          ],

Un autre avec le panier Détails du produit dont le produit ID et la quantité sont sélectionnés par les utilisateurs uniquement.

cartProducts: [
            {
              productID: 1,
              quantity: 5,
            },
            {
              productID: 3,
              quantity: 2,
            }
          ]

J'ai filtré tous les produits que l'utilisateur a sélectionnés.

cartItemDetails() {
      return this.productDetails.filter(
        el => this.cartProducts.some(f => f.id === el.productID),
      );
    },

Cette fonction donne les détails du produit des ID produit 1 et 3. Ce que je veux, c'est un nouveau tableau qui ajoute l'attribut quantité du tableau cartProducts au tableau productDetails.

newArray: [
            {
              productID: 1,
              productTitle: 'Product Title 1',
              productPrice: 2000,
              quantity:5
            },
            {
              productID: 3,
              productTitle: 'Product Title 3',
              productPrice: 1000,
              quantity:5
            }
          ]

J'espère avoir clarifié mes questions. J'essaie également de résoudre ce problème avec la méthode javascript de la carte, mais cela ne fonctionne pas.

Cordialement,

Réponses:


3

Vous pouvez utiliser map () après filter()et ajouter une quantitypropriété à chaque élément.

const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }]; 

function cartItemDetails() {
  return productDetails
    .filter(el => cartProducts.some(f => f.productID === el.productID))
    .map(item => ({
      ...item,
      "quantity": cartProducts.find(f => f.productID === item.productID).quantity
    }));
}

console.log(cartItemDetails());

Ou vous pouvez utiliser réduire () .

const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }]; 

function cartItemDetails() {
  return productDetails.reduce((acc, curr) => {
    let item = cartProducts.find(f => f.productID === curr.productID);

    if (item) {
      acc.push({ ...curr,
        "quantity": item.quantity
      });
    }

    return acc;
  }, []);
}

console.log(cartItemDetails());

Vous pouvez également utiliser map()sur cartProducts.

const productDetails = [{ productID: 1, productTitle: 'Product Title 1', productPrice: 2000 }, { productID: 2, productTitle: 'Product Title 2', productPrice: 5000 }, { productID: 3, productTitle: 'Product Title 3', productPrice: 1000 }, { productID: 4, productTitle: 'Product Title 4', productPrice: 10000 }];
const cartProducts = [{ productID: 1, quantity: 5 }, { productID: 3, quantity: 2 }]; 

function cartItemDetails() {
  return cartProducts.map(item => ({
    ...productDetails.find(f => f.productID === item.productID),
    ...item
  }));
}

console.log(cartItemDetails());


Très apprécié. Merci pour différentes variétés de réponses. J'accepte cette réponse entre autres en raison de la variété de ses méthodes. Merci
Sujan Shrestha

Vous êtes les bienvenus @SujanShrestha. Je suis content que cela ait aidé.
Nikhil

4

Utilisez la carte et la répartition des objets pour combiner les deux tableaux:

var newArray = cartProducts.map(cart => ({
  ...cart,
  ...productDetails.find(prod => prod.productID === cart.productID)
}));

Merci pour votre réponse. Très appréciée.
Sujan Shrestha

Je vous en prie. Regardez bien avec votre projet.
jaspenlind

4

Convertissez le productDetailsen Map ( productDetailsMap), en utilisant le productIDcomme clé.

Itérer le cartProductsavec Array.map()obtenir le produit actuel productDetailsMappar lui productIDet fusionner en le diffusant dans un nouvel objet.

const productDetails = [{"productID":1,"productTitle":"Product Title 1","productPrice":2000},{"productID":2,"productTitle":"Product Title 2","productPrice":5000},{"productID":3,"productTitle":"Product Title 3","productPrice":1000},{"productID":4,"productTitle":"Product Title 4","productPrice":10000}]
const cartProducts = [{"productID":1,"quantity":5},{"productID":3,"quantity":2}]

const productDetailsMap = new Map(productDetails.map(o => [o.productID, o]))

const result = cartProducts.map(o => ({
  ...productDetailsMap.get(o.productID),
  ...o
}))

console.log(result)


1
Merci pour le code propre. votre réponse est si propre et simple. Merci
Sujan Shrestha

3

Vous pouvez essayer quelque chose de similaire à ceci:

cartItemDetails() {
    return this.cartProducts.map(cp => {
         let prod = this.productDetails.find(pd => pd.productID === cp.productID)
         return {...cp, ...prod}
    })
}

J'espère que cela t'aides :)


Merci pour votre réponse. Très appréciée.
Sujan Shrestha

3

Vous pouvez utiliser la Object.assign()méthode pour copier des paires propriété-valeur de productDetails dans cartProducts chaque fois que le productID correspond:

let productDetails = [
            {
              productID: 1,
              productTitle: 'Product Title 1',
              productPrice: 2000
            },
            {
              productID: 2,
              productTitle: 'Product Title 2',
              productPrice: 5000
            },
            {
              productID: 3,
              productTitle: 'Product Title 3',
              productPrice: 1000
            },
            {
              productID: 4,
              productTitle: 'Product Title 4',
              productPrice: 10000
            }
          ];

let cartProducts = [
            {
              productID: 1,
              quantity: 5,
            },
            {
              productID: 3,
              quantity: 2,
            }
          ];
cartProducts.map(cart => Object.assign(cart, productDetails.find(product => product.productID === cart.productID))  )
console.log(cartProducts)


1
Merci pour votre réponse. Très appréciée.
Sujan Shrestha

3
cartProducts.map(cartProduct => {
  return {
    ...productDetails.find(product => product.productID === cartProduct.productID),
    "quantity": cartProduct.quantity
  }
});

Vous pouvez faire des vérifications nulles si nécessaire.


Merci pour votre réponse. Très appréciée.
Sujan Shrestha

3

C'est ce qui dérange votre code ici:

cartItemDetails() {
      return this.productDetails.filter(
        el => this.cartProducts.some(f => f.id === el.productID),
      );
    },

fqui est un cartProductsélément n'a pas de propriété id.

Je pense que ce que vous vouliez dire est f.productIDplutôt.

Voici maintenant un moyen d'ajouter la quantitypropriété en utilisant la mapfonction:

this.productDetails = cartItemDetails().map((element) => {
  for (let e of this.cartProducts) {
    if (e.productID === element.productID) return {...element, quantity: e.quantity}
  }
})

Array cartProducts avait un élément id dans mon code local. Lors de la publication de la question, je l'ai modifiée pour être plus claire. Et merci pour votre réponse.
Sujan Shrestha
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.