2013-10-24 78 views
0

我具有以下代碼以兩個對象合併兩個對象在javascript

合併

代碼:

var goals = {1:"first",2:"second"}; 
var pages = {1:"page1",2:"page2"}; 

var result = {}; 

for(var goal in goals){ 
    for(var page in pages){ 
     if(page.hasOwnProperty(goal)){ 
     result[goal] = {"goal":goals[goal],"page":pages[page]}; 
     } 
    } 
} 

console.log(result); 

預期結果:

result = {1:{"goal":"first","page":"page1"},2:{"goal":"second","page":"page2"}}; 

代碼工作正常和獲得預期的產出。

任何建議改變它,或者最好與此同行。

改進代碼

var result = {}; 

    for(var goal in goals){ 
    if(pages.hasOwnProperty(goal)){ 
     result[goal] = {"goal":goals[goal],"page":pages[goal]}; 
     } 
    } 
+2

使用hasOwnProperty() –

+0

@ lukas.pukenis編輯代碼。它現在正確嗎? – karthick

+0

如果頁面具有更多屬性,那麼它將不會顯示在您的輸出中。這種情況會發生嗎? – eggward

回答

0

您需要使用obj.hasOwnProperty()

當你做for x in y它提供了一個對象的所有屬性和方法。

obj.hasOwnProperty()告訴你一個屬性是對象上還是原型中的直接屬性(如果返回false)。

你的擴展功能應該是這樣的:

function extend(src, dst){ 
    for(var key in dst) 
     if(dst.hasOwnProperty(key)) 
      src[key] = dst[key]; 
    return src; 
1

你的解決方案是O(m * n個)。以下爲O(M + N):

var goals = {1:"first",2:"second"}; 
var pages = {1:"page1",2:"page2"}; 

var result = {}; 
for(var x in goals){ 
if(!result[x])result[x] = {}; 
result[x].goals = goals[x]; 
} 
for(var x in pages){ 
if(!result[x])result[x] = {}; 
result[x]. page = pages[x]; 
} 
+0

可能更高效且完整:在循環一個對象時,檢查這些鍵是否存在於第二個對象中。當然,將它添加到結果後刪除屬性(參見我的回答)。你也沒有過濾('hasOwnProperty')循環。這是多餘的9/10例,是真的,但你永遠不知道OP將如何使用你的代碼 –

1

隨着Underscore.js你會得到一個很好的和簡單的一行:

var result = _.extend(goals, pages); 
+0

我強烈建議下劃線以及 – fray88