मेरे पास ऑब्जेक्ट्स की एक सरणी है और मुझे प्रत्येक ऑब्जेक्ट को नाम से वर्गीकृत करने की आवश्यकता है और फिर कुछ गुणों को जोड़ने की आवश्यकता है।

अधिक विशिष्ट होने के लिए, मेरे पास कुछ ऑर्डर के साथ एक कार्ट है और मुझे उत्पाद के नाम से टूटने की जरूरत है ताकि मैं गणना कर सकूं कि उस उत्पाद के कितने आइटम खरीदे गए थे।

const orders = [
{
    name: 'Isaac',
    products: [
      {
        name: 'Apple',
        unit: 'x6 und',
        qty: 1
      },
      {
        name: 'Lemon',
        unit: '500gr',
        qty: 2
      },
      {
        name: 'Coconut',
        unit: 'x3 und',
        qty: 1
      },
      {
        name: 'Orange',
        unit: 'kg',
        qty: 1
      },
    ]
  },
  {
    name: 'Andrea',
    products: [
      {
        name: 'Apple',
        unit: 'x6 und',
        qty: 2
      },
      {
        name: 'Lemon',
        unit: '500gr',
        qty: 3
      },
      {
        name: 'Coconut',
        unit: 'x3 und',
        qty: 2
      },
      {
        name: 'Garlic',
        unit: '250 gr',
        qty: 2
      },
    ]
  },
  {
    name: 'George',
    products: [
      {
        name: 'Apple',
        unit: 'x6 und',
        qty: 3
      },
      {
        name: 'Lemon',
        unit: '500gr',
        qty: 4
      },
      {
        name: 'Coconut',
        unit: 'x3 und',
        qty: 3
      },
      {
        name: 'Garlic',
        unit: '250 gr',
        qty: 1
      },
    ]
  }
]

वह डमी डेटा है,

मैंने ऑर्डर ऐरे को मैप किया और फिर प्रोडक्ट्स ऐरे को मैप किया, फिर मैंने ऑब्जेक्ट्स की एक और ऐरे को पाने के लिए .flat () मेथड का इस्तेमाल किया लेकिन सरलीकृत किया।

अब मैं फंस गया हूँ।

const resume = orders.map(order => {
return order.products.map(prods => {
    return prods
  })
})

console.log(resume.flat());

यह परिणाम है:

    [
  { name: 'Apple', unit: 'x6 und', qty: 1 },
  { name: 'Lemon', unit: '500gr', qty: 2 },
  { name: 'Coconut', unit: 'x3 und', qty: 1 },
  { name: 'Orange', unit: 'kg', qty: 1 },
  { name: 'Apple', unit: 'x12 und', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 2 },
  { name: 'Lemon', unit: '500gr', qty: 3 },
  { name: 'Coconut', unit: 'x3 und', qty: 2 },
  { name: 'Garlic', unit: '250 gr', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 3 },
  { name: 'Lemon', unit: '500gr', qty: 4 },
  { name: 'Coconut', unit: 'x3 und', qty: 3 },
  { name: 'Garlic', unit: '250 gr', qty: 1 }
]

इस बिंदु पर, मुझे यह जानने की जरूरत है कि कितने सेब, नारियल, लहसुन बेचे गए।

उदाहरण: नाम: 'Apple', इकाई: 'X6 und', मात्रा: 6 नाम: 'Apple', इकाई: 'X12 und', मात्रा: 1 नाम: 'नींबू', इकाई: '500gr', मात्रा: 9 और जल्द ही...

कोई सुराग? मैं पूरी तरह से खो गया हूँ :(

0
Isaac Romero 16 सितंबर 2020, 01:29

3 जवाब

सबसे बढ़िया उत्तर

संभवत: reduce की तरह सुरुचिपूर्ण नहीं है, लेकिन निम्न प्रकार का मज़ा है: अपने मूल orders (मध्यवर्ती चरण की कोई आवश्यकता नहीं है, जब तक आप इसे नहीं चाहते) से शुरू करते हुए, एक खाली सरणी शुरू करें, जैसे ordersArray = [], और निम्नलिखित चलाएँ:

orders.forEach((order) => {
  order.products.forEach((product) => {
    const index = ordersArray.findIndex((prod) => prod.name === product.name);
      index === -1 ? ordersArray.push(product) : ordersArray[index].qty += product.qty  
  });
});

आपका परिणाम है:

ordersArray = [
   { name: 'Apple', unit: 'x6 und', qty: 6 },
   { name: 'Lemon', unit: '500gr', qty: 9 },
   { name: 'Coconut', unit: 'x3 und', qty: 6 },
   { name: 'Orange', unit: 'kg', qty: 1 },
   { name: 'Garlic', unit: '250 gr', qty: 3 },
 ]

यह दिखता है सही है (मुझे यकीन नहीं है कि { name: 'Apple', unit: 'x12 und', qty: 2 } ऑब्जेक्ट आपके मध्यवर्ती चरण के लिए कहां से आया है :))। हाल ही में, मैं इस तरह की जानकारी को किसी ऑब्जेक्ट में संग्रहीत कर रहा हूं (देखें यहां)। यह बहुत समान होगा, केवल मामूली अंतर के साथ: उसी orders (जाहिर है) से शुरू करें, और फिर एक खाली वस्तु ordersObject = {} को परिभाषित करें।

orders.forEach((order) => {
  order.products.forEach((product) => {
    ordersObject[product.name] = { unit: product.unit, qty: (ordersObject[product.name]?.qty || 0) + product.qty }
  });
});

परिणाम समान है, लेकिन अपडेट करना, डेटा पुनर्प्राप्त करना आदि आसान है।

ordersObject = {
  Apple: { unit: 'x6 und', qty: 6 },
  Lemon: { unit: '500gr', qty: 9 },
  Coconut: { unit: 'x3 und', qty: 6 },
  Orange: { unit: 'kg', qty: 1 },
  Garlic: { unit: '250 gr', qty: 3 }
}
1
Dharman 16 सितंबर 2020, 03:27
const orders = [
  { name: 'Apple', unit: 'x6 und', qty: 1 },
  { name: 'Lemon', unit: '500gr', qty: 2 },
  { name: 'Coconut', unit: 'x3 und', qty: 1 },
  { name: 'Orange', unit: 'kg', qty: 1 },
  { name: 'Apple', unit: 'x12 und', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 2 },
  { name: 'Lemon', unit: '500gr', qty: 3 },
  { name: 'Coconut', unit: 'x3 und', qty: 2 },
  { name: 'Garlic', unit: '250 gr', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 3 },
  { name: 'Lemon', unit: '500gr', qty: 4 },
  { name: 'Coconut', unit: 'x3 und', qty: 3 },
  { name: 'Garlic', unit: '250 gr', qty: 1 }
]

const getQuantityItem = (orders, item) => orders.reduce((acc,val)=>{
acc+=val.name===item? val.qty: 0;
return acc;
},0);

console.log(getQuantityItem(orders, 'Apple'));
0
Talmacel Marian Silviu 16 सितंबर 2020, 01:37

समूह आइटम के लिए मानचित्र या ऑब्जेक्ट का उपयोग करें, जिसे "ग्रुपबी" ऑपरेशन के रूप में जाना जाता है।

आप name और unit मानों को एक साथ जोड़ सकते हैं ताकि एक ही नाम के लिए कुंजी के रूप में उपयोग किया जा सके लेकिन प्रत्येक नाम और इकाई माप के लिए अद्वितीय वस्तु प्राप्त करने के लिए अलग-अलग इकाइयां। उत्पाद आईडी असाइन करना भी सहायक हो सकता है और समूहीकरण के लिए इसका उपयोग कर सकता है।

यदि आप चाहें तो आप एक नाम के तहत विभिन्न उपायों/मात्राओं को घोंसला बनाने के लिए भी संशोधित कर सकते हैं

const group = data.reduce((m, {name, unit, qty})=>{
   const key = `${name}|${unit}`;
   if(!m.has(key)){
      m.set(key, {name, unit, qty:0})
   }
   m.get(key).qty += qty;
   return m;
}, new Map);

const res = [...group.values()].sort((a,b) => a.name.localeCompare(b.name))
console.log(res)
.as-console-wrapper {   max-height: 100%!important;top:0;}
<script>

   const data= [
  { name: 'Apple', unit: 'x6 und', qty: 1 },
  { name: 'Lemon', unit: '500gr', qty: 2 },
  { name: 'Coconut', unit: 'x3 und', qty: 1 },
  { name: 'Orange', unit: 'kg', qty: 1 },
  { name: 'Apple', unit: 'x12 und', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 2 },
  { name: 'Lemon', unit: '500gr', qty: 3 },
  { name: 'Coconut', unit: 'x3 und', qty: 2 },
  { name: 'Garlic', unit: '250 gr', qty: 2 },
  { name: 'Apple', unit: 'x6 und', qty: 3 },
  { name: 'Lemon', unit: '500gr', qty: 4 },
  { name: 'Coconut', unit: 'x3 und', qty: 3 },
  { name: 'Garlic', unit: '250 gr', qty: 1 }
]
</script>
0
charlietfl 16 सितंबर 2020, 03:59