根据 Javascript 中的 属性 值从数组对象中获取唯一对象

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

我有一个对象数组:

const data = [{
    "Name": "Mike",
    "Age": "24",
    "debt": "1000"
  },
  {
    "Name": "Mike",
    "Age": "24",
    "debt": "2000"
  },
  {
    "Name": "Nathan",
    "Age": "26",
    "debt": "500"
  },
]

如何根据名称的唯一值创建一个对象数组,包括分配给该名称的所有债务的总和?

例如:

const newData= [{
    "Name": "Mike",
    "Age": "24",
    "debt": "3000"
  },
  {
    "Name": "Nathan",
    "Age": "26",
    "debt": "500"
  },
]

我尝试了几种方法,其中我首先根据名称获取唯一数据:

//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)

但我也只得到 Nathan 的输出而不是 mike。

以下代码可能对您有所帮助。

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)
     }
  } 

我找到了您的解决方案。试试这个:

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;
  
}

也许它可以更优化一些,但它可以满足您的要求:)