81

JSON私はそれらのような複数を持っています

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

彼らは入れ子になったり、そのようなものではありません。基本的に分野が違うだけ。次のようJSONに、node.jsでそれらを 1 つに結合する必要があります。

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

jQueryは問題なく使えます。ブラウザでの実際の例を次に示します。

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

しかし、これをnode.jsで行う場合、jQuery をロードしたくありません (これは少し使いすぎで、node.js の jQueryはWindowsマシンでは動作しません)。

jQuery$.extend()を使わずに同様のことを行う簡単な方法はありますか?

4

18 に答える 18

51

extendジェームズがコメントしたように、アンダースコアはこれを達成するための最も簡単で迅速な方法です。

アンダースコアを使用した例を次に示します。

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

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

object 1 は object2 のプロパティを取得し、返されて target に割り当てられます。object1 の変更を気にするかどうかに応じて、次のようにすることもできます。

var target = {};
_.extend(target, object1, object2);
于 2013-02-20T09:21:29.367 に答える
42

通常のループ?

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は、JavaScriptといくつかの構文を共有する単なるテキスト形式です。

于 2013-02-20T08:01:49.240 に答える
15

マージを使用します。

$ 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
于 2014-01-16T22:47:48.097 に答える
12

このスレッドは古すぎるようですが、ログを記録する目的でここに回答を掲載しました。

上記のコメントの 1 つで、依存関係リストに「connect」ライブラリがあるプロジェクトで「express」を使用したいと述べました。実際、'connect.utils' ライブラリには、このトリックを実行する 'merge' メソッドが含まれています。そのため、新しいサードパーティ ライブラリを追加しなくても、サードパーティの実装を使用できます。

于 2013-08-25T13:33:22.710 に答える
11

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"}
于 2013-02-20T11:52:34.130 に答える
2

Lodashは、こ​​れらの種類のユーティリティのもう 1 つの強力なツール ベルト オプションです。参照: _.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 }] } 
于 2016-09-05T21:14:49.473 に答える
2

ネストされたオブジェクトの拡張や配列の置換などの特別な動作が必要な場合は、Node.js のextendsを使用できます。

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}
于 2014-07-06T17:53:42.793 に答える
1

以下のコードは、ネストされたオブジェクトを持つ 2 つの 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;
}
于 2014-06-17T10:15:07.087 に答える