मेरे पास इस तरह की वस्तुओं की एक सरणी है

  data = [
    {
      Category_Name: "Furniture",
      Status_Name: "Available",
      Count: 1
    },
    {
      Category_Name: "License",
      Status_Name: "Available",
      Count: 3
    },
    {
      Category_Name: "Laptop",
      Status_Name: "Good Condition",
      Count: 1
    },
    {
      Category_Name: "Laptop",
      Status_Name: "Good Condition",
      Count: 1
    },
    {
      Category_Name: "Vehicle",
      Status_Name: "Requested",
      Count: 2
    },
    {
      Category_Name: "Furniture",
      Status_Name: "Good Condition",
      Count: 1
    }
  ];

मैं कोशिश कर रहा हूं, पहले, समान Category_Name और योग गणना मान जो मैंने इसे सही बनाया है, और दूसरा लौटाई गई वस्तु के अंदर status नामक एक नई सरणी बनाएं जो स्थिति नामों से गिना जाएगा (Available, Good Condition and Requested). तो अंतिम परिणाम इस तरह होगा

[
  {
    Category_Name: "Furniture",
    total: 2,
    status: [
      {
        Available: 1,
        Good_Condition: 1,
        Requested: 0
      }
    ]
  },
  {
    Category_Name: "License",
    total: 3,
    status: [
      {
        Available: 3,
        Good_Condition: 0,
        Requested: 0
      }
    ]
  },
  {
    Category_Name: "Laptop",
    total: 2,
    status: [
      {
        Available: 0,
        Good_Condition: 2,
        Requested: 0
      }
    ]
  },
  {
    Category_Name: "Vehicle",
    total: 2,
    status: [
      {
        Available: 0,
        Good_Condition: 0,
        Requested: 2
      }
    ]
  }
];

मैं केवल कुल प्राप्त करने तक ही हल कर सकता हूं

{
    Category_Name: "Furniture",
    total: 2,
},
..

साथ

        data.forEach(function(d) {
          if (holder.hasOwnProperty(d.Category_Name)) {
            holder[d.Category_Name] =
              holder[d.Category_Name] + d.Count;
          } else {
            holder[d.Category_Name] = d.Count;
          }
        });


        for (var prop in holder) {
          obj2.push({ Category_Name: prop, total: holder[prop] });
        }

और मुझे स्थिति सरणी प्राप्त करने में समस्या हो रही है, अगर कोई मेरी मदद कर सकता है, तो मैं बहुत सराहना करता हूं, धन्यवाद।

1
Kaung Khant Zaw 5 नवम्बर 2020, 10:05

2 जवाब

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

आप एक सरणी को कम करने और ऐसा करने के लिए उपयोग कर सकते हैं, मैंने स्थिति को एक सरणी के बजाय एक वस्तु बना दिया है, यदि आप एक छोटे से बदलाव के साथ आवश्यक हो तो आप ऐसा कर सकते हैं।

यदि स्थिति के लिए 0 गणनाओं की आवश्यकता नहीं है, तो आप स्थिति गणनाओं को गतिशील रूप से पॉप्युलेट करके कोड को सरल बना सकते हैं

const reducer = (a, c) => {
  const item = a.find((x) => x.Category_Name === c.Category_Name);
  const status = c["Status_Name"].replace(' ', '_');
  if (item) {
    item.Total += c.Count;
    item.status[status] += c.Count;
  } else {
    const newItem = {
      Category_Name: c.Category_Name,
      Total: c.Count,
      status: {
        Available: 0,
        Good_Condition: 0,
        Requested: 0
      }
    };
    newItem.status[status] += c.Count;
    a.push(newItem);
  }
  return a;
};

const data = [
  {
    Category_Name: "Furniture",
    Status_Name: "Available",
    Count: 1
  },
  {
    Category_Name: "License",
    Status_Name: "Available",
    Count: 3
  },
  {
    Category_Name: "Laptop",
    Status_Name: "Good Condition",
    Count: 1
  },
  {
    Category_Name: "Laptop",
    Status_Name: "Good Condition",
    Count: 1
  },
  {
    Category_Name: "Vehicle",
    Status_Name: "Requested",
    Count: 2
  },
  {
    Category_Name: "Furniture",
    Status_Name: "Good Condition",
    Count: 1
  }
];


console.log(data.reduce(reducer, []));
2
Guruparan Giritharan 5 नवम्बर 2020, 10:47

आप शायद इसे छोटा कर सकते हैं लेकिन मैंने जानबूझकर इसे वर्बोज़ बना दिया है ताकि आप देख सकें कि क्या हो रहा है। मैं पहले data के माध्यम से लूप कर रहा हूं और परिणामों को totals नामक ऑब्जेक्ट में डाल रहा हूं, जिसमें चाबियाँ Category_Name हैं। यह हर बार एक सरणी के माध्यम से खोजने के बजाय किसी दिए गए श्रेणी के नाम को खोजना आसान बनाता है।

एक बार totals बन जाने के बाद, मैं प्रभावी रूप से चाबियों को हटा देता हूं और इसे Object.values(totals) के साथ एक सरणी में बदल देता हूं, और परिणामों को results में संग्रहीत करता हूं।

let totals = {};
  
data.forEach( function(row) {
    if ( totals[row.Category_Name] ) {
        if ( totals[ row.Category_Name ].status[0][ row.Status_Name ] ) {
            totals[ row.Category_Name ].status[0][ row.Status_Name ]++;
        } else {
            totals[ row.Category_Name ].status[0][ row.Status_Name ] = 1;
        }
        totals[ row.Category_Name ].total += row.Count;
    } else {
        totals[row.Category_Name] = {
            Category_Name: row.Category_Name,
            total: row.Count,
            status: [ { [row.Status_Name]: 1 } ] // https://stackoverflow.com/a/2274327/378779
        }
    }
});

let results = Object.values(totals);

console.log(results);
1
kmoser 5 नवम्बर 2020, 10:29