简体   繁体   中英

Getting unique objects from object of array based on property value in Javascript

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM