Gabungkan dua array setelah menggunakan metode filter


9

Saya tidak dapat menunjukkan halaman keranjang tempat produk terdaftar yang ditambahkan ke Keranjang oleh Pengguna. Saya memiliki dua array: Satu dengan detail produk.

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

Lain lagi dengan detail Produk Keranjang yang memiliki ID produk dan jumlah yang dipilih oleh pengguna saja.

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

Saya telah memfilter semua produk yang dipilih pengguna.

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

Fungsi ini memberikan detail produk dari productID 1 dan 3. Yang saya inginkan adalah array baru yang menambahkan atribut kuantitas array cartProducts ke array productDetails.

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

Saya harap saya sudah menjelaskan pertanyaan saya. Saya juga mencoba menyelesaikan masalah ini dengan metode peta javascript tetapi tidak berfungsi.

Salam,

Jawaban:


3

Anda dapat menggunakan peta () setelah filter()dan menambahkan quantityproperti ke setiap item.

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

Atau Anda dapat menggunakan mengurangi () .

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

Anda juga dapat menggunakan map()pada 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());


Sangat dihargai. Terima kasih atas berbagai variasi jawaban. Saya menerima jawaban ini antara lain karena beragam metodenya. Terima Kasih
Sujan Shrestha

Sama-sama @SujanShrestha. Saya senang itu membantu.
Nikhil

4

Gunakan peta dan penyebaran objek untuk menggabungkan dua array:

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

Terima kasih atas jawaban Anda. Sangat dihargai.
Sujan Shrestha

Sama-sama. Terlihat bagus dengan proyek Anda.
jaspenlind

4

Konversikan productDetailske Peta ( productDetailsMap), menggunakan tombol productIDsebagai.

Iterasi cartProductsdengan Array.map()dapatkan produk saat ini dari productDetailsMapdengan itu productID, dan bergabung dengan menyebar ke objek baru.

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
Terima kasih atas kode bersihnya. jawaban Anda sangat bersih dan sederhana. Terima Kasih
Sujan Shrestha

3

Anda dapat mencoba sesuatu yang mirip dengan ini:

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

Semoga ini membantu :)


Terima kasih atas jawaban Anda. Sangat dihargai.
Sujan Shrestha

3

Anda dapat menggunakan Object.assign()metode untuk menyalin pasangan nilai properti dari productDetails ke cartProducts setiap kali productID cocok:

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
Terima kasih atas jawaban Anda. Sangat dihargai.
Sujan Shrestha

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

Anda dapat melakukan beberapa pemeriksaan nol jika diperlukan.


Terima kasih atas jawaban Anda. Sangat dihargai.
Sujan Shrestha

3

Inilah yang mengacaukan kode Anda di sini:

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

fyang merupakan cartProductsitem tidak memiliki properti id.

Saya pikir yang Anda maksudkan adalah f.productIDsebaliknya.

Sekarang inilah cara untuk menambahkan quantityproperti menggunakan mapfungsi:

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

Array cartProducts memiliki elemen id dalam kode lokal saya. Saat memposting pertanyaan saya mengubahnya menjadi lebih jelas. Dan terima kasih atas jawaban Anda.
Sujan Shrestha
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.