जावास्क्रिप्ट में दो साहचर्य सरणियों के विलय का सबसे अच्छा / मानक तरीका क्या है? क्या हर कोई सिर्फ अपना for
लूप रोल करके ऐसा करता है ?
जावास्क्रिप्ट में दो साहचर्य सरणियों के विलय का सबसे अच्छा / मानक तरीका क्या है? क्या हर कोई सिर्फ अपना for
लूप रोल करके ऐसा करता है ?
जवाबों:
jquery के साथ आप कॉल कर सकते हैं $.extend
var obj1 = {a: 1, b: 2};
var obj2 = {a: 4, c: 110};
var obj3 = $.extend(obj1, obj2);
obj1 == obj3 == {a: 4, b: 2, c: 110} // Pseudo JS
(assoc। सरणियाँ js में ऑब्जेक्ट हैं)
यहाँ देखें : http://api.jquery.com/jQuery.extend/
संपादित करें: जैसे rymo ने सुझाव दिया है, यह इस तरह से करना बेहतर है:
obj3 = $.extend({}, obj1, obj2);
obj3 == {a: 4, b: 2, c: 110}
यहाँ के रूप में obj1 (और obj2) अपरिवर्तित रहते हैं।
edit2: 2018 में इसे करने का तरीका Object.assign
निम्न है:
var obj3 = Object.assign({}, obj1, obj2);
obj3 === {a: 4, b: 2, c: 110} // Pseudo JS
ES6 के साथ काम करने पर यह स्प्रेड ऑपरेटर के साथ प्राप्त किया जा सकता है :
const obj3 = { ...obj1, ...obj2 };
obj1
$.extend({}, obj1, obj2)
Object.assign()
, जो कि JQuery पर निर्भर नहीं करता है यदि आप पहले से ही पुस्तकालय का उपयोग नहीं कर रहे हैं।
अब 2016 में मैं कहूंगा कि सबसे अच्छा / मानक तरीका Object.assign ()
शुद्ध जावास्क्रिप्ट है। कोई jQuery की जरूरत है।
obj1 = {a: 1, b: 2};
obj2 = {a: 4, c: 110};
obj3 = Object.assign({},obj1, obj2); // Object {a: 4, b: 2, c: 110}
अधिक जानकारी, उदाहरण और पॉलीफ़िल यहां:
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/assign
इस प्रकार यह प्रोटोटाइप करता है:
Object.extend = function(destination, source) {
for (var property in source) {
if (source.hasOwnProperty(property)) {
destination[property] = source[property];
}
}
return destination;
};
उदाहरण के लिए कहा जाता है:
var arr1 = { robert: "bobby", john: "jack" };
var arr2 = { elizabeth: "liz", jennifer: "jen" };
var shortnames = Object.extend(arr1,arr2);
संपादित करें : hasOwnProperty () की जाँच करें जैसा कि टिप्पणियों में bucabay द्वारा सही ढंग से बताया गया है
इसे सरल रखें...
function mergeArray(array1,array2) {
for(item in array1) {
array2[item] = array1[item];
}
return array2;
}
arrau1.prototype
hasOwnProperty
जाँच की आवश्यकता है । ऑब्जेक्ट को सरणियों के रूप में संदर्भित करना भी भ्रामक है (वे ऑब्जेक्ट्स हैं), arg नामों को यह बताना चाहिए कि array2 उत्परिवर्तित है या एक नई वस्तु वापस आनी चाहिए। मैं उत्तर को संपादित करूंगा लेकिन वास्तव में यह जोनाथन फिंगलैंड के संपादित उत्तर के लगभग ठीक हो जाएगा जो पहले ही सही हो चुका है।
अंडरस्कोर में एक विस्तार विधि भी है:
गंतव्य ऑब्जेक्ट पर स्रोत ऑब्जेक्ट में सभी गुणों की प्रतिलिपि बनाएँ। यह क्रम में है, इसलिए अंतिम स्रोत पिछले तर्कों में एक ही नाम के गुणों को ओवरराइड करेगा।
_.extend(destination, *sources)
_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}
में डोजो , 2-वस्तुओं / सरणियों "मर्ज" होगा lang.mixin(destination, source)
- तब आपको एक गंतव्य में कई स्रोतों मिश्रण कर सकते हैं आदि - देख mixin समारोह के संदर्भ जानकारी के लिए।
क्या आप एक संपत्ति को अधिलेखित करना चाहते हैं यदि नाम समान हैं लेकिन मान नहीं हैं?
और क्या आप मूल वस्तुओं में से किसी एक को स्थायी रूप से बदलना चाहते हैं,
या क्या आप एक नई मर्ज की गई वस्तु वापस चाहते हैं?
function mergedObject(obj1, obj2, force){
for(var p in obj1) this[p]= obj1[p];
for(var p in obj2){
if(obj2.hasOwnProperty(p)){
if(force || this[p]=== undefined) this[p]= obj2[p];
else{
n= 2;
while(this[p+n]!== undefined)++n;
this[p+n]= obj2[p];
}
}
}
}
function extend(objects) {
var args
, first = Array.prototype.slice.call(arguments, 0, 1)[0]
, second;
if (arguments.length > 1) {
second = Array.prototype.splice.call(arguments, 1, 1)[0];
for (var key in second) {
first[key] = second[key];
}
args = Array.prototype.slice.call(arguments, 0);
return extend.apply(this, args);
}
return first;
}
...
var briansDirections = {
step1: 'Remove pastry from wrapper.',
step2: 'Place pastry toaster.',
step3: 'Remove pastry from toaster and enjoy.',
};
extend(briansDirections, { step1: 'Toast Poptarts' }, { step2: 'Go ahead, toast \'em' }, { step3: 'Hey, are you sill reading this???' });
...
यह बस वस्तुओं की एक परत का विस्तार करता है , पुनरावर्ती रूप से। यह भी ध्यान दें कि यह पुनरावर्ती कार्य TCO ( टेल-कॉल ऑप्टिमाइज़्ड ) है क्योंकि इसकी वापसी अपने आप में अंतिम कॉल है।
इसके अतिरिक्त, आप लक्षित गुण चाहते हैं । इस मामले में, आप वस्तुओं को आधार बनाना चाहते हैं id
,quantity
या उसे किसी अन्य संपत्ति। इस दृष्टिकोण में इसके बारे में एक छोटी सी पुस्तक लिखी जा सकती है और इसके लिए ऑब्जेक्ट-जूसकप की आवश्यकता होती है और यह बहुत जटिल हो सकता है। मैंने इसके लिए एक छोटी सी लाइब्रेरी लिखी है जो अनुरोध पर उपलब्ध है।
उम्मीद है की यह मदद करेगा!
2019 में आपके पास 2 अच्छे विकल्प हैं:
ऑब्जेक्ट असाइन करना [ डॉक्टर ]
const result = Object.assign({}, baseObject, updatingObject);
फैली हुई वस्तु [ डॉक्टर ]
const result = { ...baseObject, ...updatingObject};
पहले वाला अधिक सुरक्षित, अधिक मानक और पॉलीवलेंट हो जाता है। एक अच्छा पेशेवरों और विपक्ष यहाँ
याहू यूआई (YUI) के पास इसके लिए एक सहायक कार्य भी है:
http://developer.yahoo.com/yui/examples/yahoo/yahoo_merge.html
YAHOO.namespace('example');
YAHOO.example.set1 = { foo : "foo" };
YAHOO.example.set2 = { foo : "BAR", bar : "bar" };
YAHOO.example.set3 = { foo : "FOO", baz : "BAZ" };
var Ye = YAHOO.example;
var merged = YAHOO.lang.merge(Ye.set1, Ye.set2, Ye.set3);
गहरी नकल के लिए जूलरी में बूलियन होता है। आप ऐसा कुछ कर सकते हैं:
MergeRecursive = function(arr1, arr2){
$.extend(true, arr1, arr2);
return arr1;
};
साथ ही आप इस फ़ंक्शन को मर्ज करने के लिए n-सरणियों का समर्थन करने के लिए संपादित कर सकते हैं।
ArrayMergeRecursive = function(){
if(arguments.length < 2){
throw new Error("ArrayMergeRecursive: Please enter two or more objects to merge!");
}
var arr1=arguments[0];
for(var i=0; i<=arguments.length; i++ ){
$.extend(true, arr1, arguments[i]);
}
return arr1;
};
तो अब आप कर सकते हैं
var arr1 = {'color': {'mycolor': 'red'}, 3: 5},
arr2 = {4: 10, 'color': {'favorite': 'green', 0: 'blue'}},
arr3 = ['Peter','Jhon','Demosthenes'],
results = ArrayMergeRecursive(arr1, arr2, arr3); // (arr1, arr2 ... arrN)
console.log("Result is:", results);
मुझे एक गहरी वस्तु-विलय की आवश्यकता थी। इसलिए अन्य सभी उत्तरों से मुझे बहुत मदद नहीं मिली। _.extend और jQuery.extend अच्छा करते हैं, जब तक कि आपके पास पुनरावर्ती सरणी नहीं है जैसे कि मैं करता हूं। लेकिन यह इतना बुरा नहीं है, आप इसे पाँच मिनट में प्रोग्राम कर सकते हैं:
var deep_merge = function (arr1, arr2) {
jQuery.each(arr2, function (index, element) {
if (typeof arr1[index] === "object" && typeof element === "object") {
arr1[index] = deep_merge(arr1[index], element);
} else if (typeof arr1[index] === "array" && typeof element === "array") {
arr1[index] = arr1[index].concat(element);
} else {
arr1[index] = element;
}
});
return arr1;
}
JQuery में सरणियों को मर्ज करने के लिए $ .merge के बारे में क्या?
var merged = $.merge([{id:3, value:'foo3'}], [{id:1, value:'foo1'}, {id:2, value:'foo2'}]);
merged[0].id == 3;
merged[0].value == 'foo3';
merged[1].id == 1;
merged[1].value == 'foo1';
merged[2].id == 2;
merged[2].value == 'foo2';
var addProps = function (original, props) {
if(!props) {
return original;
}
if (Array.isArray(original)) {
original.map(function (e) {
return addProps(e, props)
});
return original;
}
if (!original) {
original = {};
}
for (var property in props) {
if (props.hasOwnProperty(property)) {
original[property] = props[property];
}
}
return original;
};
टेस्ट
console.log(addProps([{a: 2}, {z: 'ciao'}], {timestamp: 13}));
console.log(addProps({single: true}, {timestamp: 13}));
console.log(addProps({}, {timestamp: 13}));
console.log(addProps(null, {timestamp: 13}));
[ { a: 2, timestamp: 13 }, { z: 'ciao', timestamp: 13 } ]
{ single: true, timestamp: 13 }
{ timestamp: 13 }
{ timestamp: 13 }
Object.getOwnPropertyNames is not a function
ऐप को क्रैश कर देगा।