Javascript 按id定位数组中的对象并基于可变参数更改其值:为什么我的代码可以工作?

Javascript 按id定位数组中的对象并基于可变参数更改其值:为什么我的代码可以工作?,javascript,Javascript,问题不在于代码,而是我不明白为什么我所拥有的可以工作,尽管它做了我需要它做的事情。我正在开发一个跟踪工作的应用程序。每个作业都是一个对象,存储在JSON文件的数组中。我添加了在JSON文件中编辑作业的键/值对的功能 无论如何,我的函数editJob接受一个对象作为一个参数,该参数具有一个id和数量可变的其他属性。然后,目标是在JSON中找到与id匹配的作业,然后仅基于editItems对象更新该作业的属性。我只是不明白Object.keys代码下面的那行。为什么不将定位的作业的键与editIte

问题不在于代码,而是我不明白为什么我所拥有的可以工作,尽管它做了我需要它做的事情。我正在开发一个跟踪工作的应用程序。每个作业都是一个对象,存储在JSON文件的数组中。我添加了在JSON文件中编辑作业的键/值对的功能

无论如何,我的函数editJob接受一个对象作为一个参数,该参数具有一个id和数量可变的其他属性。然后,目标是在JSON中找到与id匹配的作业,然后仅基于editItems对象更新该作业的属性。我只是不明白Object.keys代码下面的那行。为什么不将定位的作业的键与editItems键进行比较

我不知道它为什么会工作,我担心它会在某个时候崩溃,因为它没有正确编码

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,但感谢您的澄清。