I have an array of objects:
const data = [{
"Name": "Mike",
"Age": "24",
"debt": "1000"
},
{
"Name": "Mike",
"Age": "24",
"debt": "2000"
},
{
"Name": "Nathan",
"Age": "26",
"debt": "500"
},
]
How do I create an array of objects based on unique values of Name and Including sum of all debts assigned with that name?
For example:
const newData= [{
"Name": "Mike",
"Age": "24",
"debt": "3000"
},
{
"Name": "Nathan",
"Age": "26",
"debt": "500"
},
]
I have tried several ways, among which I first get unique data based on name:
//Original data const data = [{ "Name": "Mike", "Age": "24", "debt": "1000" }, { "Name": "Mike", "Age": "24", "debt": "2000" }, { "Name": "Nathan", "Age": "26", "debt": "500" }, ] //getting unique values based on name const unique = [...new Set(data.map(item => item.Name))] //mapping and adding each name into saperate object and later //combining it using Object.merge after adding new Debt which //contains sum of both the debts for (value in unique) { var datamenu = data.map(function(element, index, array) { if (element.Instrument === value) { unique[value] = element } return unique[value] }) } console.log(datamenu)
But I only get output of Nathan in place of mike too.
I've found your solution. Try this:
const getData = () => {
const debtSums = data.map(person => {
const personD = data.filter(el => el.Name === person.Name).reduce((prev, curr) => {
const debt = prev.debt + curr.debt;
return {...person, debt};
})
return personD;
})
const removeDuplicates = debtSums.reduce((prev, curr) => {
const alreadyPushedIndex = prev.findIndex(i => i.Name === curr.Name);
if (alreadyPushedIndex === -1) {
prev.push(curr);
}
return prev;
}, []);
return removeDuplicates;
}
Maybe it could be a bit more optimised but it does what you want:)
the below code may help you.
const arr = [
{
"Name": "Mike",
"Age": "24",
"debt": "1000"
},
{
"Name": "Mike",
"Age": "24",
"debt": "2000"
},
{
"Name": "Nathan",
"Age": "26",
"debt": "500"
},
];
let unique = []
for (let char of arr) {
let check = unique.find(e=> {
if(char.Name == e.Name){
e.debt = parseInt(e.debt) + parseInt(char.debt)
return true
}
return false;
})
if(!check) {
unique.push(char)
}
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.