2012-09-07 1 views
12

私は2つの構成オブジェクトをマージする方法を探しています、のようなもの:jQuery.extend()のようなものですが、スタンドアロンですか?

var developmentConfig = { 
    url: "localhost", 
    port: 80 
}; 

var productionConfig = { 
    url: "example.com" 
}; 

var config = isDevelopment ? developmentConfig : jQuery.extend(developmentConfig, productionConfig); 

はしかし、これはNode.jsのアプリですと、私はjQueryのを含めたくないと似たような探していますスタンドアローンです。

編集(設定オブジェクトは、など豊かな階層を使用するときにエッジケース、合併症がある)私は似た何かを書くことができ、自分自身を知っているが、私はむしろ、テストしたものを使用したいと実績:単純な反復は十分ではないという理由であります階層構造を処理しません。アンダースコアのextendもどちらもありません。

+4

は、ソースを使用し、ルーク:) – epoch

+2

本当にjQueryのソースを確認するのに役立ちますウェブサイトがあります。 'jQuery.extend'では、[ここに行きます](http://james.padolsey.com/jquery/#v=git&fn=jQuery.extend)。 –

+1

私は尋ねる前に一見を持っていましたが、extend()関数からの外部依存関係があるので、いくつかの行をコピーするだけでなく、もっと多くの作業があります。 – Borek

答えて

18

あなたが必要とするものがすべて拡張されていれば、それを数行で簡単に書くことができます。

function extend (target, source) { 
    target = target || {}; 
    for (var prop in source) { 
    if (typeof source[prop] === 'object') { 
     target[prop] = extend(target[prop], source[prop]); 
    } else { 
     target[prop] = source[prop]; 
    } 
    } 
    return target; 
} 

あなた場合:あなたが再帰的拡張をしたい場合は、それだけでいくつかのネストされたプレーンなオブジェクトだ場合、これは動作するはずなど円形構造、複雑なプロトタイプチェーンを持つオブジェクトを、持っている場合は、それは完全に一般的にそれを行うためにトリッキーですこれを行う軽量ライブラリ(上記の理由で再帰を引いたもの)やjavascriptで提供されていない他の同様の関数を探しているのですが、Underscoreを見てください。

+0

私も再帰的な行動が必要です、質問を参照してください。 – Borek

+0

@Borek私は今答えを更新しました – nickf

+3

これはあなたの配列をオブジェクトに変換します。 –

4

異なる種類の性質のマージからの保護機能を備えたこの質問全体で将来の巡礼者のためのシンプルなスタンドアローン機能のもう一つの例は:

function extend(obj) { 
    Array.prototype.slice.call(arguments, 1).forEach(function(source) { 
     if (source) { 
      for (var prop in source) { 
       if (source[prop].constructor === Object) { 
        if (!obj[prop] || obj[prop].constructor === Object) { 
         obj[prop] = obj[prop] || {}; 
         extend(obj[prop], source[prop]); 
        } else { 
         obj[prop] = source[prop]; 
        } 
       } else { 
        obj[prop] = source[prop]; 
       } 
      } 
     } 
    }); 
    return obj; 
} 

は使用方法:

extend({ name:'Maria', address:{ city:'Moscow', street:'Lenina str, 52' } }, { name:'Marianna', address:{ zip:1200003 }}) 
=> { name:'Marianna', address:{ city:'Moscow', street:'Lenina str, 52', zip:1200003 } } 
+0

"for"の最初の "if":source [prop]!== null && source [prop] .constructor ===オブジェクト –

1

このソリューションは、新しいを作成し、オブジェクト複数オブジェクトを処理することができます。

はさらに、それは、再帰的であり、あなたは、あなたがに上書き値オブジェクトたい天候を選ぶことができます。 newExtendedObjectの

function extendObjects() { 

     var newObject  = {}; 
     var overwriteValues = false; 
     var overwriteObjects = false; 

     for (var indexArgument = 0; indexArgument < arguments.length; indexArgument++) { 

      if (typeof arguments[indexArgument] !== 'object') { 

       if (arguments[indexArgument] == 'overwriteValues_True') { 

        overwriteValues = true;    
       } else if (arguments[indexArgument] == 'overwriteValues_False') { 

        overwriteValues = false;        
       } else if (arguments[indexArgument] == 'overwriteObjects_True') { 

        overwriteObjects = true;  
       } else if (arguments[indexArgument] == 'overwriteObjects_False') { 

        overwriteObjects = false; 
       } 

      } else { 

       extendObject(arguments[indexArgument], newObject, overwriteValues, overwriteObjects); 
      } 

     } 

     function extendObject(object, extendedObject, overwriteValues, overwriteObjects) { 

      for (var indexObject in object) { 

       if (typeof object[indexObject] === 'object') { 

        if (typeof extendedObject[indexObject] === "undefined" || overwriteObjects) { 
         extendedObject[indexObject] = object[indexObject]; 
        } 

        extendObject(object[indexObject], extendedObject[indexObject], overwriteValues, overwriteObjects); 

       } else { 

        if (typeof extendedObject[indexObject] === "undefined" || overwriteValues) { 
         extendedObject[indexObject] = object[indexObject]; 
        } 

       } 

      }  

      return extendedObject; 

     } 

     return newObject; 
    } 

    var object1   = { a : 1, b : 2, testArr : [888, { innArr : 1 }, 777 ], data : { e : 12, c : { lol : 1 }, rofl : { O : 3 } } }; 
    var object2   = { a : 6, b : 9, data : { a : 17, b : 18, e : 13, rofl : { O : 99, copter : { mao : 1 } } }, hexa : { tetra : 66 } }; 
    var object3   = { f : 13, g : 666, a : 333, data : { c : { xD : 45 } }, testArr : [888, { innArr : 3 }, 555 ] }; 

    var newExtendedObject = extendObjects('overwriteValues_False', 'overwriteObjects_False', object1, object2, object3); 

内容:

{"a":1,"b":2,"testArr":[888,{"innArr":1},777],"data":{"e":12,"c":{"lol":1,"xD":45},"rofl":{"O":3,"copter":{"mao":1}},"a":17,"b":18},"hexa":{"tetra":66},"f":13,"g":666} 

フィドル:http://jsfiddle.net/o0gb2umb/

関連する問題