मेरे पास इस तरह की वस्तुओं की एक सरणी है
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] });
}
और मुझे स्थिति सरणी प्राप्त करने में समस्या हो रही है, अगर कोई मेरी मदद कर सकता है, तो मैं बहुत सराहना करता हूं, धन्यवाद।
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, []));
आप शायद इसे छोटा कर सकते हैं लेकिन मैंने जानबूझकर इसे वर्बोज़ बना दिया है ताकि आप देख सकें कि क्या हो रहा है। मैं पहले 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);