2017-05-31 47 views
1

我想編輯節點中的現有用戶。我的前端是帕格。 我的用戶表有很多字段(大約20到25),有些必須是唯一的,比如電子郵件和用戶名,我有函數檢查它們是否不重複。如何檢查兩個對象的JS值不同?

我只想更新客戶端上已更改的值,我的編輯表單已經具有用戶的值,當然。

我認爲最好的方法是檢查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的問題,但似乎沒有我的情況工作..

+0

你能確認你的數據是嵌套還是普通對象嗎? – Umair

+0

在這一刻,它是一個普通的對象 –

+0

你可以檢查我的答案。 – Umair

回答

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中檢索的,所以它們爲空。另外,空體字段不是未定義的,而是字符串。這意味着如果輸入是空的,它是一個空字符串,並且將它與我的用戶對象進行比較,它應該首先爲空。

謝謝大家的回答。

2

從我從你的問題的理解,讓這個嘗試,

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

感謝您的回答! –

0

好,我認爲你已經過分複雜了。你甚至不需要lodash

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

會的工作,因爲你自己說的,你可以在req.body有不同的領域。

+0

感謝您的回答,如果我可以插入新對象,這將工作。不過,我需要知道哪些字段已更改,以便我只能更新我的用戶模型中的那些值。 –

+0

好吧。那麼我會更新我的答案。 – Umair

1

如果你需要差異對象使用這樣的:

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

+0

感謝您的回答,這非常有幫助。我只是發佈完整的解決方案,我仍然需要將空字符串設置爲null。 –