Как проверить два объекта на разницу в значениях в JS?

1

Я хочу изменить существующего пользователя в узле. Мой передний конец находится в мопсе. В моей таблице пользователя много полей (от 20 до 25), а некоторые из них должны быть уникальными, например, электронная почта и имя пользователя, и у меня есть функции, чтобы проверить, не являются ли они дубликатом.

Я только хочу обновить значения, которые изменились на клиенте, моя форма редактирования уже имеет значения пользователя, конечно.

Я думал, что лучший способ достичь этого - проверить все входы от req.body, и если он отличается от любых пользовательских значений, я должен его обновить. (Возможно, какие-то разные методы? Не могу ли я проверить, загрязнены ли входы?)

Это может быть ситуация. Обратите внимание на объект req.body со значениями, которые моя таблица пользователя не имеет, например password_confirm

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

Теперь я хочу обновить поля измененных местоположений, веб-сайтов и специалистов. Я пробовал много вещей, используя сокращение и lodash, но я не могу получить поля, которые я ищу.

NB Я уже проверял различные вопросы StackOverflow, но ничего не работает для моей ситуации.

Теги:

4 ответа

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, они равны нулю. Кроме того, пустые поля тела не определены, а строки. Значение, если вход пуст, это пустая строка, и для сравнения с моим пользовательским объектом она должна быть сначала нулевой.

Спасибо всем за их ответы.

2

Из того, что я понял из вашего вопроса, попробуйте,

Object.keys(req.body).forEach((key)=>{
    if(user[key] && user[key]!=req.body[key]){
        user[key] = req.body[key];
    }
})
  • 0
    Спасибо за Ваш ответ!
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 : '[email protected]',
	password : '1234',
	password_confirm : '1234',
	location : 'New York',
	website : 'new-website.com',
	bio : undefined,
	expertise : 'New expertise'
}
var user = {
	username : 'test',
	email : '[email protected]',
	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));
  • 0
    Спасибо за ваш ответ, это было очень полезно. Я только что опубликовал полное решение, мне все еще нужно было установить пустые строки в нуль.
0

Ну, я думаю, вы слишком усложняете. Для этого вам даже не нужен lodash.

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

будет работать, поскольку вы сами сказали, что у вас могут быть разные поля в req.body.

  • 0
    Спасибо за ваш ответ, это сработало бы, если бы я мог просто вставить новый объект. Однако мне нужно знать, какие поля изменились, чтобы я мог обновлять только те значения в моей модели User
  • 0
    Хорошо. Я обновлю свой ответ тогда.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню