Javascript 按id定位数组中的对象并基于可变参数更改其值:为什么我的代码可以工作?
问题不在于代码,而是我不明白为什么我所拥有的可以工作,尽管它做了我需要它做的事情。我正在开发一个跟踪工作的应用程序。每个作业都是一个对象,存储在JSON文件的数组中。我添加了在JSON文件中编辑作业的键/值对的功能 无论如何,我的函数editJob接受一个对象作为一个参数,该参数具有一个id和数量可变的其他属性。然后,目标是在JSON中找到与id匹配的作业,然后仅基于editItems对象更新该作业的属性。我只是不明白Object.keys代码下面的那行。为什么不将定位的作业的键与editItems键进行比较 我不知道它为什么会工作,我担心它会在某个时候崩溃,因为它没有正确编码Javascript 按id定位数组中的对象并基于可变参数更改其值:为什么我的代码可以工作?,javascript,Javascript,问题不在于代码,而是我不明白为什么我所拥有的可以工作,尽管它做了我需要它做的事情。我正在开发一个跟踪工作的应用程序。每个作业都是一个对象,存储在JSON文件的数组中。我添加了在JSON文件中编辑作业的键/值对的功能 无论如何,我的函数editJob接受一个对象作为一个参数,该参数具有一个id和数量可变的其他属性。然后,目标是在JSON中找到与id匹配的作业,然后仅基于editItems对象更新该作业的属性。我只是不明白Object.keys代码下面的那行。为什么不将定位的作业的键与editIte
function editJob (editItems) {
// editItems is an object like this: ex. { id: 3, customer: 'Artemis', source: 'Google', description: 'Fixed toilet' }
return this.jobs.map(job => {
let editedJobs = Object.assign({}, job);
if (editedJobs.id === editItems.id) {
Object.keys(editItems).forEach(k => {
if (editedJobs[k] === job[k]) { // WHY DOES THIS WORK. why job[k] and not editItems[k]???
editedJobs[k] = editItems[k];
}
});
}
return editedJobs;
});
}
由于您刚刚执行了
editedJobs=Object.assign({},job)
,因此表达式editedJobs[k]==job[k]
对于每个k
都将为true
。你可以省略它。你也可以通过
function editJob (editItems) {
return this.jobs.map(job => {
return job.id === editItems.id
? Object.assign({}, job, editItems)
: job;
});
}
由于您刚刚执行了
editedJobs=Object.assign({},job)
,因此表达式editedJobs[k]==job[k]
对于每个k
都将为true
。你可以省略它。你也可以通过
function editJob (editItems) {
return this.jobs.map(job => {
return job.id === editItems.id
? Object.assign({}, job, editItems)
: job;
});
}
事实上,我根本不明白那张支票的意义
editedJobs
是job
的(浅)副本。比较它们有什么意义?我个人认为,editedJobs[k]==job[k]
不会是true
。这不是你想象的那样editedJobs[k]==job[k]
将始终为真,除非您在editItems中有重复的键。但这是不可能的,因为JS对象不能有重复的键。所以如果(editedJobs[k]==job[k])
总是正确的。这是可以删除的冗余代码。实际上,我根本不明白检查的意义editedJobs
是job
的(浅)副本。比较它们有什么意义?我个人认为,editedJobs[k]==job[k]
不会是true
。这不是你想象的那样editedJobs[k]==job[k]
将始终为真,除非您在editItems中有重复的键。但这是不可能的,因为JS对象不能有重复的键。所以如果(editedJobs[k]==job[k])
总是正确的。这是可以删除的冗余代码。非常感谢!这样效率更高。我想我不知道赋值方法能做什么。因此,如果ID匹配,它将返回一个新对象,该对象是job的副本,并且…editItems参数到底在做什么?与job
相同。Object.assign
调用将所有属性从它们复制到{}
对象,然后返回该对象。比如说:让job={name:Dave,age:21}和让arg2={age:50}。创建作业的副本,然后在复制arg2时,是否替换年龄值?在这之后,我将立即改进我的javascript,但感谢您的澄清。非常感谢!这样效率更高。我想我不知道赋值方法能做什么。因此,如果ID匹配,它将返回一个新对象,该对象是job的副本,并且…editItems参数到底在做什么?与job
相同。Object.assign
调用将所有属性从它们复制到{}
对象,然后返回该对象。比如说:让job={name:Dave,age:21}和让arg2={age:50}。创建作业的副本,然后在复制arg2时,是否替换年龄值?在此之后,我将立即改进我的javascript,但感谢您的澄清。