2013-10-24 3 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 (м * п). Ниже О (т + п):

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

Может быть более эффективным и законченным: во время цикла над одним объектом проверьте, существуют ли эти ключи во втором. Удалите свойство, если это произойдет, после добавления его к результату, конечно (cf мой ответ). Вы также не фильтруете ('hasOwnProperty') цикл. Это избыточное 9/10 случаев, правда, но вы никогда не знаете, как OP собирается использовать ваш код. –

1

С Underscore.js вы получите хороший и простой Однострочник:

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

. Я настоятельно рекомендую подчеркнуть также – fray88

Смежные вопросы