web-dev-qa-db-de.com

Kombinieren oder kombinieren Sie JSON in node.js ohne jQuery

Ich habe mehrere JSON wie diese

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

Sie nisten nicht oder ähnliches. Grundsätzlich verschiedene Bereiche. Ich muss sie in node.js wie folgt zu einer einzigen JSON zusammenfassen:

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

Ich kann jQuery einfach gut verwenden. Hier ist ein Funktionsbeispiel im Browser:

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

Aber wenn ich dies in node.js mache, möchte ich jQuery nicht laden (was ein bisschen zu viel ist, und node.js 'jQuery funktioniert bei mir nicht Windows Maschine).

Gibt es eine einfache Möglichkeit, Dinge ähnlich wie $.extend() ohne jQuery auszuführen?

65
HP.

Eine normale Schleife? 

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);

Das ist ein grundlegender Ausgangspunkt. Sie können Dinge wie eine hasOwnProperty-Prüfung hinzufügen oder eine Logik hinzufügen, um den Fall zu behandeln, bei dem mehrere Quellobjekte eine Eigenschaft mit derselben Kennung haben.

Hier ist ein Arbeitsbeispiel .

Randnotiz: Was Sie als "JSON" bezeichnen, sind eigentlich normale JavaScript-Objekte. JSON ist einfach ein Textformat, das einige Syntax mit JavaScript teilt.

38
James Allardice

Sie sollten " Object.assign () " verwenden.

Es ist nicht nötig, das Rad neu zu erfinden, um einen so einfachen Anwendungsfall der flachen Verschmelzung zu schaffen.

Die Object.assign () -Methode wird verwendet, um die Werte aller aufzählbaren eigenen Eigenschaften von einem oder mehreren Quellobjekten in ein Zielobjekt zu kopieren. Das Zielobjekt wird zurückgegeben.

var o1 = { a: 1 };
var o2 = { b: 2 };
var o3 = { c: 3 };

var obj = Object.assign(o1, o2, o3);
console.log(obj); // { a: 1, b: 2, c: 3 }
console.log(o1);  // { a: 1, b: 2, c: 3 }, target object itself is changed

Sogar die Leute von Node.js sagen es :

_extend war niemals für die Verwendung außerhalb von internen NodeJS-Modulen vorgesehen. Die Community hat es trotzdem gefunden und benutzt . Es ist veraltet und sollte nicht in neuem Code verwendet werden. JavaScript verfügt über sehr ähnliche integrierte Funktionen durch Object.assign.


Aktualisieren:

Sie können den Spread-Operator verwenden.

Seit Version 8.6 ist es möglich, den spread-Operator in Node.js nativ zu verwenden. Beispiel unten:

let o1 = { a: 1 };
let o2 = { b: 2 };
let obj = { ...o1, ...o2 }; // { a: 1, b: 2 }

Object.assign funktioniert jedoch immer noch.


PS1: Wenn Sie tatsächlich an deep minning interessiert sind (in dem interne Objektdaten in beliebiger Tiefe rekursiv zusammengeführt werden), können Sie Pakete wie deepmerge , verwenden. Zuweisungstiefe oder lodash.merge , die ziemlich klein und einfach zu verwenden sind .

PS2: Beachten Sie, dass Object.assign nicht mit 0.X-Versionen von Node.js funktioniert. Wenn Sie mit einer dieser Versionen arbeiten (sollten Sie jetzt wirklich nicht), können Sie require("util")._extend wie im Link Node.js oben angezeigt verwenden. Weitere Informationen finden Sie in der Antwort auf tobymackenzie diese gleiche Frage .

85
Ricardo Nolde

Bei Verwendung der Knotenversion> = 4 verwenden Sie Object.assign() (siehe Antwort von Ricardo Nolde ).

Bei Verwendung von Knoten 0.x gibt es das eingebaute util._extend:

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

Es ist keine tiefe Kopie und erlaubt nur zwei Argumente gleichzeitig, sondern ist eingebaut. Ich habe dies bei einer Frage zum Klonen von Objekten im Knoten erwähnt: https://stackoverflow.com/a/15040626 .

Wenn Sie Bedenken haben, eine "private" Methode zu verwenden, können Sie sie immer als Proxy verwenden:

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

und ersetzen Sie es durch Ihre eigene Implementierung, wenn es jemals verschwindet. Dies ist (ungefähr) ihre Implementierung:

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;
};
55
tobymackenzie

Underscores extend ist der einfachste und schnellste Weg, dies zu erreichen, wie James kommentierte.

Hier ein Beispiel mit Unterstrich:

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

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

object 1 erhält die Eigenschaften von object2 und wird zurückgegeben und an target ..__ übergeben. Sie können dies auch so tun, je nachdem, ob Objekt 1 geändert wird:

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

Verwenden Sie merge .

$ npm install merge

Beispielcode:

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
15
zim

Ich sehe, dass dieser Thread zu alt ist, aber ich stelle meine Antwort hier nur zu Protokollierungszwecken.

In einem der obigen Kommentare haben Sie erwähnt, dass Sie .__ verwenden wollten. 'express' in Ihrem Projekt, das 'connect' -Bibliothek in der .__ enthält. Abhängigkeitsliste. Tatsächlich enthält die Bibliothek 'connect.utils' eine Zusammenführung Methode, die den Trick tut. Sie können also die 3rd Party Implementierung, ohne neue Bibliotheken von Drittanbietern hinzuzufügen.

12
Petr KOKOREV

Hier ist eine einfache Lösung zum Zusammenführen von JSON . Ich habe Folgendes getan.

  • Konvertieren Sie jeden JSON mit JSON.stringify(object) in Zeichenfolgen.
  • Verketten Sie alle JSON-Zeichenfolgen mit dem Operator +.
  • Ersetzen Sie das Muster /}{/g durch ","
  • Analysieren Sie die Ergebniszeichenfolge zurück zum JSON-Objekt

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

Die resultierende zusammengeführte JSON wird sein

{name: "John", location: "San Jose"}
10
Manu K Mohan

In Node.js gibt es eine einfache Möglichkeit

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

Um dies zu kombinieren/zu erweitern, können Sie den Operator ... in ECMA6 verwenden

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

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

console.log(result)

3
Stenal P Jolly

Sie können auch dieses leichte npm-Paket mit dem Namen absorb verwenden.

Es ist 27 Zeilen Code, 1 KB und verwendet Rekursion, um tiefe Objektzusammenführungen durchzuführen.

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' }

Sie können es auch verwenden, um einen Klon zu erstellen oder nur Werte zu übertragen, wenn sie nicht im Quellobjekt vorhanden sind. Wie dies zu tun ist, ist im Link angegeben.

3
Patrick Murphy

Dies kann leicht mit der Object.assign () -Methode durchgeführt werden.

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

jetzt ist object3 {Name: 'John', Ort: 'San Jose'}

2
Sushil Kumar

Lodash ist eine weitere leistungsstarke Tool-Belt-Option für diese Art von Dienstprogrammen. Siehe: _.merge() (was rekursiv ist)

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 }] } 
2
JoshuaDavid

Wenn Sie spezielle Verhaltensweisen wie geschachtelte Objekterweiterung oder Array-Ersetzung benötigen, können Sie Node.js's extendify verwenden.

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}
2
user1928072

Mit dem folgenden Code können Sie zwei JSON-Objekte zusammenführen, die verschachtelte Objekte enthalten.

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;
}
1
shibualexis

Spread-Operator verwenden. Es wird seit Version 8.6 in Node unterstützt

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

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

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

1

Sie können Lodash verwenden

const _ = require('lodash');

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

Sie können dies inline tun, ohne die Variablen wie folgt zu ändern:

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

Ein besserer Ansatz aus der richtigen Lösung hier, um das Ziel nicht zu verändern:

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