2012-09-07 19 views
12

मैं एक तरह से दो विन्यास को मर्ज करने के लिए देख रहा हूँ एक साथ वस्तुओं, कुछ की तरह:jQuery.extend() लेकिन कुछ स्टैंडअलोन की तरह कुछ?

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

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

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

बहरहाल, यह एक Node.js अनुप्रयोग है और मैं jQuery शामिल करने के लिए नहीं करना चाहते हैं और कुछ इसी तरह रहा हूँ लेकिन स्टैंडअलोन। मैं अपने आप को पता है कि मैं कुछ इसी तरह लिख सकता है लेकिन मैं नहीं बल्कि कुछ परीक्षण किया प्रयोग करेंगे और सिद्ध

संपादित (जब config वस्तुओं अमीर पदानुक्रम आदि का उपयोग बढ़त मामलों, जटिलताओं देखते हैं): सरल यात्रा पर्याप्त है क्योंकि वह नहीं है पदानुक्रमित संरचनाओं को संभाल नहीं करता है। न तो अंडरस्कोर extend करता है।

+4

स्रोत का उपयोग, ल्यूक :) – epoch

+2

वहाँ एक वेबसाइट है कि वास्तव में jQuery के स्रोत की जाँच के साथ मदद करता है है। 'JQuery.extend' के लिए, [यहां आप जाते हैं] (http://james.padolsey.com/jquery/#v=git&fn=jQuery.extend)। –

+1

मुझे पूछने से पहले एक नजर आया लेकिन विस्तार() फ़ंक्शन से बाहरी निर्भरताएं हैं इसलिए कुछ पंक्तियों की प्रतिलिपि बनाने के बजाय और अधिक काम करना है। – 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; 
} 

आप तो एक लाइटवेट लाइब्रेरी की तलाश में है जो यह करता है (उपरोक्त सूचीबद्ध कारणों के लिए रिकर्सन, कम से कम कारणों के लिए) और अन्य समान फ़ंक्शन जावास्क्रिप्ट द्वारा प्रदान नहीं किए गए हैं, Underscore देखें जो नोड के लिए एनपीएम के माध्यम से भी उपलब्ध है।

+0

मुझे भी रिकर्सिव व्यवहार की आवश्यकता है, सवाल देखें। – Borek

+0

@ बोरेक मैंने अब जवाब अपडेट किया है – 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

पहले "अगर" में "के लिए": स्रोत [प्रोप]! == शून्य और स्रोत [प्रोप] .constructor === ऑब्जेक्ट –

1

यह समाधान एक नया बनाता है ऑब्जेक्ट और एकाधिक ऑब्जेक्ट को संभालने में सक्षम है।

इसके अलावा, यह पुनरावर्ती है और आप मौसम आप चाहते हैं को अधिलेखित मान और वस्तुओं चुन सकते हैं।

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

newExtendedObject की सामग्री:

{"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/

संबंधित मुद्दे