Объединить или объединить 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?
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}
Это можно легко сделать с помощью объекта.назначить () метод -
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"};чтобы объединить / расширить это мы можем использовать
...оператор в ECMA6var 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