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

时间:2017-05-31 16:19:59

标签: javascript node.js

我想在Node中编辑现有用户。我的前端是哈巴狗。 我的用户表有很多字段(大约20到25个),有些必须是唯一的,比如电子邮件和用户名,我可以检查它们是否不重复。

我只想更新客户端上已更改的值,我的编辑表单当然已经包含了用户的值。

我认为实现这一目标的最佳方法是检查来自req.body的所有输入,如果它与任何用户值不同,我应该更新它。 (也许有任何不同的方法?我能否检查输入是否“脏”?)

情况可能就是这样。请注意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
}

我现在只想更新已更改的位置,网站和专业知识字段。我尝试过很多东西,使用reduce和lodash,但是我无法获得我正在寻找的字段。

NB 我已经检查了不同的StackOverflow问题,但似乎没有任何东西适用于我的情况..

4 个答案:

答案 0 :(得分:2)

从我对你的问题的理解,尝试一下,

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

答案 1 :(得分:1)

如果你需要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));

答案 2 :(得分:0)

好吧,我觉得你过于复杂了。你甚至不需要lodash

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

会起作用,因为你自己说过req.body可以有不同的字段。

答案 3 :(得分:0)

我明白了。

基于@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中检索的,所以它们为空。此外,空体字段不是未定义的,而是字符串。意思是如果输入为空,则它是一个空字符串,并且要将它与我的用户对象进行比较,它应该首先为null。

感谢大家的回答。