Объединить или объединить JSON на узле.js без jQuery



у меня есть несколько JSON как те



var object1 = {name: "John"};
var object2 = {location: "San Jose"};


они не гнездятся или что-то в этом роде. Просто в разных областях. Мне нужно объединить их в один JSON на узел.js такой:



{name: "John", location: "San Jose"}


Я могу использовать jQuery просто отлично. Вот рабочий пример в браузере:



http://jsfiddle.net/qhoc/agp54/



но если я сделаю это в узел.js, Я не хочу загрузите jQuery (который немного превышает использование, плюс узел.js ' jQuery на Windows машина).



так есть ли простой способ сделать вещи, подобные $.extend() без jQuery?

879   18  

18 ответов:

нормальный цикл?

function extend(target) {
    var sources = [].slice.call(arguments, 1);
    sources.forEach(function (source) {
        for (var prop in source) {
            target[prop] = source[prop];
        }
    });
    return target;
}

var object3 = extend({}, object1, object2);

это основная отправная точка. Вы можете добавить такие вещи, как hasOwnProperty проверьте или добавьте некоторую логику для обработки случая, когда несколько исходных объектов имеют свойство с одинаковым идентификатором.

здесь пример работающего.

Примечание: то, что вы называете "JSON", на самом деле является нормальными объектами JavaScript. JSON-это просто текстовый формат, который разделяет некоторый синтаксис с Яваскрипт.

вы должны использовать "

если используется версия узла >= 4, Используйте Object.assign() (см. ответ Рикардо Нольде).

при использовании узла 0.x, есть встроенный в util._extend:

var extend = require('util')._extend
var o = extend({}, {name: "John"});
extend(o,  {location: "San Jose"});

он не делает глубокую копию и позволяет только два аргумента одновременно, но встроен. Я видел это упомянутое на вопрос о клонировании объектов в узле:https://stackoverflow.com/a/15040626.

если вы обеспокоены использованием "частного" метода, вы всегда можете прокси это:

// myutil.js
exports.extend = require('util')._extend;

и замените его своей собственной реализацией, если она когда-либо исчезнет. Это (примерно) их реализация:

exports.extend = function(origin, add) {
    if (!add || (typeof add !== 'object' && add !== null)){
        return origin;
    }

    var keys = Object.keys(add);
    var i = keys.length;
    while(i--){
        origin[keys[i]] = add[keys[i]];
    }
    return origin;
};

библиотеки Underscore!--2--> Это самый простой и быстрый способ достичь этого, как Джеймс прокомментировал.

вот пример использования подчеркивания:

var _ = require('underscore'), // npm install underscore to install
  object1 = {name: "John"},
  object2 = {location: "San Jose"};

var target = _.extend(object1, object2);

объект 1 получит свойства объекта 2 и будет возвращен и назначен цели. Вы также можете сделать это так, в зависимости от того, будете ли вы возражать против изменения object1:

var target = {};
_.extend(target, object1, object2);

использовать слияние.

$ npm install merge

пример кода:

var merge = require('merge'), // npm install -g merge
    original, cloned;

console.log(

    merge({ one: 'hello' }, { two: 'world' })

); // {"one": "hello", "two": "world"}

original = { x: { y: 1 } };

cloned = merge(true, original);

cloned.x.y++;

console.log(original.x.y, cloned.x.y); // 1, 2

Я вижу, что этот поток слишком стар, но я положил мой ответ здесь только в целях лесозаготовки.

в одном из комментариев выше вы упомянули, что вы хотели использовать "Экспресс" в ваш проект, подключить библиотеки список зависимостей. На самом деле подключить.библиотека utils содержит "слияние" метод, который делает трюк. Так что вы можете использовать 3-й партии реализация без добавления каких-либо новых сторонних библиотек.

вот простое решение, чтобы объединить JSON. Я сделал следующее.

  • преобразуйте каждый из JSON в строки с помощью JSON.stringify(object).
  • объединить все строки JSON с помощью + оператора.
  • заменить шаблон /}{/g С ","
  • синтаксический анализ результирующей строки обратно в объект JSON

    var object1 = {name: "John"};
    var object2 = {location: "San Jose"};
    var merged_object = JSON.parse((JSON.stringify(object1) + JSON.stringify(object2)).replace(/}{/g,","))
    

результирующий объединенный JSON будет

{name: "John", location: "San Jose"}

вы также можете использовать этот легкий пакет npm под названием поглощать

это 27 строк кода, 1 Кб и использует рекурсию для выполнения глубоких слияний объектов.

var absorb = require('absorb');
var obj1, obj2;

obj1 = { foo: 123, bar: 456 };
obj2 = { bar: 123, key: 'value' }

absorb(obj1, obj2);

console.log(obj1); // Output: { foo: 123, bar: 123, key: 'value' }

вы также можете использовать его, чтобы сделать клон или только значения передачи, если они не существуют в исходном объекте, как это сделать подробно описано в указанной ссылке.

Если вам нужны специальные поведения, такие как расширение вложенного объекта или замена массива, вы можете использовать Node.в JS это extendify.

var extendify = require('extendify');

_.extend = extendify({
    inPlace: false,
    arrays : 'replace',
    isDeep: true
});

obj1 = {
    a:{
        arr: [1,2]
    },
    b: 4
};

obj2 = {
    a:{
        arr: [3]
    }
};

res = _.extend(obj1,obj2);
console.log(JSON.stringify(res)); //{'a':{'arr':[3]},'b':4}

Лодашь еще один мощный инструмент-пояс вариант для этих видов утилит. Смотрите:_.merge() (который является рекурсивным)

var object = {
  'a': [{ 'b': 2 }, { 'd': 4 }]
};
var other = {
  'a': [{ 'c': 3 }, { 'e': 5 }]
}; 
_.merge(object, other);
// => { 'a': [{ 'b': 2, 'c': 3 }, { 'd': 4, 'e': 5 }] } 

Это можно легко сделать с помощью объекта.назначить () метод -

 var object1 = {name: "John"};
 var object2 = {location: "San Jose"};
 var object3 = Object.assign(object1,object2);
 console.log(object3);

теперь object3-это { имя: 'John', местоположение: 'San Jose'}

есть простой способ сделать это в узел.js

var object1 = {name: "John"};
var object2 = {location: "San Jose"};

чтобы объединить / расширить это мы можем использовать ... оператор в ECMA6

var object1 = {name: "John"};
var object2 = {location: "San Jose"};

var result = {
  ...object1,
  ...object2
}

console.log(result)

приведенный ниже код поможет вам объединить два объекта JSON, которые имеют вложенные объекты.

function mergeJSON(source1,source2){
    /*
     * Properties from the Souce1 object will be copied to Source2 Object.
     * Note: This method will return a new merged object, Source1 and Source2 original values will not be replaced.
     * */
    var mergedJSON = Object.create(source2);// Copying Source2 to a new Object

    for (var attrname in source1) {
        if(mergedJSON.hasOwnProperty(attrname)) {
          if ( source1[attrname]!=null && source1[attrname].constructor==Object ) {
              /*
               * Recursive call if the property is an object,
               * Iterate the object and set all properties of the inner object.
              */
              mergedJSON[attrname] = zrd3.utils.mergeJSON(source1[attrname], mergedJSON[attrname]);
          } 

        } else {//else copy the property from source1
            mergedJSON[attrname] = source1[attrname];

        }
      }

      return mergedJSON;
}

вы можете использовать Lodash

const _ = require('lodash');

let firstObject = {'email' : '[email protected]};
let secondObject = { 'name' : { 'first':message.firstName } };
_.merge(firstObject, secondObject)

лучший подход из правильного решения здесь, чтобы не изменять цель:

function extend(){
  let sources = [].slice.call(arguments, 0), result = {};
  sources.forEach(function (source) {
    for (let prop in source) {
      result[prop] = source[prop];
    }
  });
  return result;
}

вы можете сделать это встроенным, без изменения каких-либо переменных, как это:

let obj1 = { name: 'John' };
let obj2 = { surname: 'Smith' };
let obj = Object.assign({}, obj1, obj2); // { name: 'John', surname: 'Smith' }

использовать оператор spread. Он поддерживается в узле, начиная с версии 8.6

const object1 = {name: "John"};
const object2 = {location: "San Jose"};

const obj = {...object1, ...object2}

console.log(obj)
//   {
//     "name": "John",
//     "location": "San Jose"
//   }

пусть object1 и object2 быть два объекта JSON.

var object1 = [{"name": "John"}];
var object2 = [{"location": "San Jose"}];

object1.push(object2);

это будет просто добавить object2 на object1:

[{"name":"John"},{"location":"San Jose"}]

Comments

    Ничего не найдено.