如何检查JS中的两个对象的差异值?

我想编辑节点中的现有用户。 我的前端是帕格。 我的用户表有很多字段(大约20到25),有些必须是唯一的,比如电子邮件和用户名,我有函数来检查它们是不是重复的。

我只想更新客户端已更改的值,我的编辑窗体当然已经具有用户的值。

我认为最好的方法是检查req.body中的所有input,如果它与任何用户值不同,我应该更新它。 (也许有任何不同的方法?我不能检查input是否“脏”?)

这可能是情况。 请注意req.body对象,我的用户表没有像password_confirm

 req.body = { username: 'test', email: 'user@user.com', password: '1234', password_confirm: '1234', location: 'New York', website: 'new-website.com', bio: undefined, expertise: 'New expertise' } user = { username: 'test', email: 'user@user.com', password: '1234', location: 'San Fransico', website: 'website.com', bio: null, expertise: null } 

我现在只想更新更改的位置,网站和专业领域。 我尝试了很多东西,使用减less和lodash,但我不能得到我正在寻找的领域。

NB我已经检查了不同的StackOverflow问题,但似乎没有任何工作适合我的情况..

从我所了解的问题来看,试试这个,

 Object.keys(req.body).forEach((key)=>{ if(user[key] && user[key]!=req.body[key]){ user[key] = req.body[key]; } }) 

如果你需要diff对象使用这个:

 function diff(oldObject, newObject) { const diff = {}; Object.keys(oldObject).forEach((key) => { if (oldObject[key] != newObject[key] && newObject[key] !== undefined) { diff[key] = newObject[key]; } }); return diff; } 
 var body = { username : 'test', email : 'user@user.com', password : '1234', password_confirm : '1234', location : 'New York', website : 'new-website.com', bio : undefined, expertise : 'New expertise' } var user = { username : 'test', email : 'user@user.com', password : '1234', location : 'San Fransico', website : 'website.com', bio : null, expertise : null } function diff(oldObject, newObject) { const diff = {}; Object.keys(oldObject).forEach((key) => { if (oldObject[key] != newObject[key] && newObject[key] !== undefined) { diff[key] = newObject[key]; } }); return diff; } console.log(diff(user, body)); 

好吧,我想你已经过分复杂了。 你甚至不需lodash

 Object.assign({}, user, req.body); 

会工作,因为你说自己,你可以有req.body不同的领域。

我想到了。

基于@ ponary-kostek&@anuragasaurus的回答,这对我来说是有效的:

  const differences = {}; Object.keys(req.body).forEach((key)=> { if(req.body[key].length == 0) req.body[key] = null; if(stakeholder.hasOwnProperty(key) && stakeholder[key]!=req.body[key]){ differences[key] = req.body[key]; } }); 

这将返回具有更改的键和值的对象。

因为我的用户对象的字段是从SQL DB中检索的,所以它们是空的。 另外,空体字段不是未定义的,而是string。 这意味着如果input是空的,它是一个空string,并将其与我的用户对象进行比较,它应该首先为空。

谢谢大家的答案。