Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/454.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向对象数组添加数据时,如何防止重复键?_Javascript - Fatal编程技术网

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

Javascript 向对象数组添加数据时,如何防止重复键?,javascript,Javascript,我有一些代码,在其中我循环遍历表中的一些记录,同时我将这些数据组织到一个JavaScript对象数组中 例如下面的数据 我需要确保,如果记录“Name”已被记录,那么它将使用现有项而不是创建新项,以便最终结果将是如下所示的对象或数组: { "bobjones": { "sessions": 7 }, "annfrank": { "sessions": 4 }, "fredsmith": { "sess

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

例如下面的数据

我需要确保,如果记录“Name”已被记录,那么它将使用现有项而不是创建新项,以便最终结果将是如下所示的对象或数组:

{
    "bobjones": {
         "sessions": 7
    },
    "annfrank": {
         "sessions": 4
    },
    "fredsmith": {
         "sessions": 4
    }
}
在PHP中这样做很容易,但在JS中,由于键的解释方式,我很难做到这一点。有人能提供一些方向吗

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)
现在输出数据为:

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

您只需测试对象属性是否存在。如果是,则添加到其
会话
属性,如果不是,则设置它

if(obj[prop]) {
    obj[prop].sessions += sessions;
} else {
    obj[prop] = { sessions };
}
在第一个if语句中,如果您担心
obj[prop]
可能存在,但是
obj[prop].sessions
可能不存在,则可以将其更改为
if(obj[prop]&&obj[prop].sessions){…}
,假设您输入的数据是一个对象数组,则可以使用该方法(因为,这通常是查询数据库时获取数据的方式)

const表=[
{姓名:“鲍勃·琼斯”,日期:“2019年12月12日”,会议日期:3},
{名称:“安·弗兰克”,日期:“2019年9月12日”,会议日期:4},
{姓名:“鲍勃·琼斯”,日期:“2019年9月12日”,会议日期:2},
{姓名:“弗雷德·史密斯”,日期:“2019年9月12日”,会议:4}
];
let res=table.reduce((res,{name,date,sessions})=>
{
如果(res[[name]])
res[[name]].sessions+=会话;
其他的
res[[name]]={sessions:sessions};
返回res;
}, {});

console.log(res);
您能提供输入数据吗?数组会调用一些括号,其中包含所有括号。这是示例中的错误还是单个数组元素?对象的可能副本似乎格式不正确。使用类似于
[{name:'bobjones',sessions:'7'},]
。我正在将这些数据组织到一个JavaScript对象数组中。我看到了一个对象,但没有看到数组