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,

Sujan Shrestha
la source

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());

Nikhil
la source
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)
}));
jaspenlind
la source
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)

Ori Drori
la source
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 :)

Royson
la source
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)

Addis
la source
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.

Ashish Modi
la source
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}
  }
})
Bradzer
la source
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