Объединить объекты

У меня есть два объекта, такие как:

{ Count: 1,
  Items:
   [ { foo: [Object],
       name: [Object],
       bar: [Object],
       baz: [Object],
       qux: [Object] } ] }

а также

{ Count: 0, Items: [] }

Мне нужно объединить их и вернуть один объект JSON. Однако, когда я пытаюсь это сделать, я получаю

"[object Object][object Object]"

код:

function returnResponse(obj1, obj2) {
            res.statusCode = 200;
            res.setHeader('Content-Type', 'text/plain; charset=UTF-8');
            var returnResult = obj1 + obj2
            res.send(JSON.stringify(returnResult, undefined, 2));
            res.end();
        }

Как сделать так, чтобы все объекты правильно отображались в браузере?


person Cmag    schedule 09.12.2013    source источник
comment
Как, по-вашему, будет выглядеть объединенный результат? + конкатенация строк производительности, а строковое представление объекта по умолчанию — [object Object].   -  person Felix Kling    schedule 09.12.2013
comment
К вашему сведению, похоже, вы путаете литералы объектов JavaScript (конструкции синтаксиса языка JavaScript) с JSON (независимый от языка формат обмена данными, такой как XML или CSV). obj1 и obj2 — это объекты, а не объекты JSON. Не существует такой вещи, как объект JSON .   -  person Felix Kling    schedule 09.12.2013
comment
Я думаю, это не имеет значения. Он определенно писал о простых объектах JS.   -  person Bohdan Yurov    schedule 09.12.2013
comment
В конце концов, я пытаюсь вернуть объекты JSON в браузер.   -  person Cmag    schedule 09.12.2013
comment
@nick4fake: Умение пользоваться терминологией очень важно при общении с другими. Из контекста может быть ясно, что OP говорит об объектах JS, но если я смогу обучить их сейчас, они не сделают ту же ошибку в другом, может быть, менее очевидном месте.   -  person Felix Kling    schedule 09.12.2013
comment
@Clustermagnet: Да, я понимаю. Но вы генерируете только JSON в конце, в результате объекты/данные, с которыми вы фактически работаете, не являются JSON, и, следовательно, проблема вообще не связана с JSON.   -  person Felix Kling    schedule 09.12.2013
comment
Кроме того, вы так и не объяснили, чего ожидаете в результате. Как видите, ответы варьируются от создания массивов до слияния объектов. Если вы объясните, что вы ожидаете, мы сможем помочь вам лучше.   -  person Felix Kling    schedule 09.12.2013
comment
@FelixKling результат, который я хотел бы выглядеть как один объект JSON в браузере   -  person Cmag    schedule 09.12.2013
comment
Значит, вам не нужен массив из двух объектов ([ {Count: 1, ...}, {Count: 0, ...}])? Вы хотите объединить свойства обоих объектов и перезаписать свойства первых объектов свойствами вторых объектов? Тогда результат будет { Count: 0, Items: [] }. Или вы хотите рекурсивно объединить свойства?   -  person Felix Kling    schedule 09.12.2013
comment
@Clustermagnet: вот один объект JS (пожалуйста, перестаньте говорить объект JSON): {}. Вот еще: { combined: true }. Существует почти бесконечное количество одиночных объектов. Это явно не то, что вам нужно, но для нас гораздо менее очевидно, что вы делаете хотите. Пожалуйста, отредактируйте свой вопрос и явно напишите, что вы ожидаете от комбинации двух ваших примеров объектов.   -  person Amadan    schedule 09.12.2013
comment
Судя по принятому ответу, похоже, вам нужен массив объектов. Если бы вы опубликовали пример ожидаемого результата, это было бы намного проще.   -  person Felix Kling    schedule 09.12.2013


Ответы (3)


Я думаю, вы хотите вернуть оба объекта в виде массива:

function returnResponse(obj1, obj2) {
    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain; charset=UTF-8');
    var returnResult = [obj1,obj2];
    res.send(JSON.stringify(returnResult, undefined, 2));
    res.end();
}
person AlliterativeAlice    schedule 09.12.2013
comment
Интересно, почему за это проголосовали :-/ - person Felix Kling; 09.12.2013

Если вы не используете JS-фреймворк, такой как jQuery, вам нужна функция рекурсивного слияния. Взгляните, например, на это.

person Maciej Sz    schedule 09.12.2013
comment
Это комментарий, а не ответ. - person Felix Kling; 09.12.2013
comment
Если вы считаете, что существующий ответ идеально решает этот вопрос, вы должны отметить / проголосовать, чтобы закрыть этот вопрос как дубликат. - person Felix Kling; 09.12.2013

Вы можете использовать метод $.extend библиотеки jQuery.

Подробнее: http://api.jquery.com/jQuery.extend/

Без jQuery, однострочник:

for (var attrname in obj2) { obj1[attrname] = obj2[attrname]; }

Кроме того, это дубликат: Как я могу объединить свойства из двух объектов JavaScript динамически?

person Bohdan Yurov    schedule 09.12.2013
comment
ОП, похоже, не использует jQuery. Если это дубликат, отметьте / проголосуйте, чтобы закрыть его как таковой. редактировать: вы сделали. - person Felix Kling; 09.12.2013
comment
Я писал, что этого можно добиться с помощью jQuery, но не писал, что это единственный способ. Также я пометил вопрос как дубликат и дал ссылку на ОП. - person Bohdan Yurov; 09.12.2013
comment
Я не использую jquery, это приложение узла - person Cmag; 09.12.2013
comment
Пожалуйста, прочитайте мой ответ еще раз. Есть ссылка на тот же вопрос, на который уже был дан ответ. - person Bohdan Yurov; 09.12.2013
comment
Как правило, вы должны предлагать решения только с использованием определенной библиотеки, если эта библиотека упоминается в вопросе или указана в тегах. - person Felix Kling; 09.12.2013
comment
Это неподходящее место для таких дискуссий, но я приму это во внимание. - person Bohdan Yurov; 09.12.2013
comment
@FelixKling В общем, когда вы представляете такие правила, как «В целом», вы должны предлагать решения только с использованием определенной библиотеки, если библиотека упоминается в вопросе или указана в тегах, вы должны предоставить ссылку на правило. - person Louis; 09.12.2013
comment
@Louis: Извините, я не могу дать ссылку. Но если вы наведете курсор на тег javascript, в описании тега вы обнаружите следующее: Если тег для framework/library также включены, ожидается ответ на чистом JavaScript. - person Felix Kling; 09.12.2013
comment
@FelixKling: или ОП забыл добавить тег. Я думаю, мы могли бы обсудить это в чате, а не комментировать ответчику. - person Bohdan Yurov; 09.12.2013