将数据添加到对象数组时,如何防止重复键?

时间:2019-01-10 15:46:53

标签: javascript

我有一些代码在其中遍历表中的某些记录,同时我将这些数据组织到一个JavaScript对象数组中。

例如下面的数据。

enter image description here

我需要确保如果已经记录了一条“名称”记录,那么与其创建一个新项目,不使用现有项目,这样最终结果将是这样的对象或数组:

{
    "bobjones": {
         "sessions": 7
    },
    "annfrank": {
         "sessions": 4
    },
    "fredsmith": {
         "sessions": 4
    }
}

在PHP中执行此操作很容易,但是由于解释键的方式,我在JS中为此感到困惑。有人可以提供一些指导吗?

3 个答案:

答案 0 :(得分:2)

const inputData = [
  { name: 'Bob Jones', date: '----', session: 1 },
  { name: 'Ann Frank', date: '----', session: 1 },
  { name: 'Bob Jones', date: '----', session: 1 },
  { name: 'Fred Smith', date: '----', session: 1 },
]

var outputData = {}
for(let doc of inputData) {
  if(outputData[doc.name]) {
    outputData[doc.name].session = outputData[doc.name].session + doc.session
  } else {
    outputData[doc.name] = doc
  }
}

console.log(outputData)

现在outputData是:

{ 'Bob Jones': { name: 'Bob Jones', date: '----', session: 2 },
  'Ann Frank': { name: 'Ann Frank', date: '----', session: 1 },
  'Fred Smith': { name: 'Fred Smith', date: '----', session: 1 } }

答案 1 :(得分:0)

您可以测试对象属性是否存在。如果是这样,请添加到其sessions属性,否则请进行设置。

if(obj[prop]) {
    obj[prop].sessions += sessions;
} else {
    obj[prop] = { sessions };
}

在第一个if语句中,如果您担心obj[prop]可能存在而obj[prop].sessions可能不存在,则可以将其更改为if(obj[prop] && obj[prop].sessions) { ... }

答案 2 :(得分:0)

您可以使用reduce方法,假设您输入的数据是一个对象数组(因为这通常是查询数据库时获取数据的方式)。

df %>%
  group_by(Year, Season) %>%
  slice(which(Month == 2 | Month == 4 | Month == 8 | Month == 10))
  #slice(which.max(value)) #selects row with largest value in each group