জাভাস্ক্রিপ্টে দুটি সহযোগী অ্যারে মার্জ করার সর্বোত্তম / মানক উপায় কী? সবাই কি কেবল নিজের 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
(অ্যাসোসিয়েশন। অ্যারেগুলি জেসের মধ্যে বস্তু)
এখানে দেখুন: http://api.jquery.com/jQuery.extend/
সম্পাদনা: রাইমোর পরামর্শ মতো, এটি এভাবে করা ভাল better
obj3 = $.extend({}, obj1, obj2);
obj3 == {a: 4, b: 2, c: 110}
যেমন এখানে আপত্তি 1 (এবং অবজেক্ট 2) অপরিবর্তিত রয়েছে।
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 এর উপর নির্ভর করে না।
এখন ২০১ in-তে আমি বলব সর্বোত্তম / মানক উপায় হ'ল 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/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / অবজেক্ট / পাসপোর্ট
প্রোটোটাইপ এটি এটি করে:
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);
সম্পাদনা : যোগ করা হয়েছে ওপেনপ্রটি () মন্তব্যগুলিতে বুকাবায়ে যথাযথভাবে নির্দেশিত হিসাবে পরীক্ষা করুন
সহজবোধ্য রাখো...
function mergeArray(array1,array2) {
for(item in array1) {
array2[item] = array1[item];
}
return array2;
}
arrau1.prototype
hasOwnProperty
চেক দরকার অ্যারে হিসাবে বস্তুগুলি উল্লেখ করাও বিভ্রান্তিমূলক (তারা বস্তু), আর্গের নামগুলি বোঝাতে হবে যে অ্যারে 2 পরিবর্তন করা হয়েছে বা একটি নতুন অবজেক্ট ফিরিয়ে দেওয়া উচিত। আমি উত্তরটি সম্পাদনা করব তবে বাস্তবে এটি জনাথন ফিংল্যান্ডের সম্পাদিত উত্তর হয়ে উঠবে যা ইতিমধ্যে সংশোধন করা হয়েছে।
ইনসকোরের একটি বর্ধিত পদ্ধতি রয়েছে:
উত্স অবজেক্টের সমস্ত বৈশিষ্ট্যকে গন্তব্য অবজেক্টে অনুলিপি করুন। এটি ক্রমযুক্ত, সুতরাং শেষ উত্সটি পূর্ববর্তী যুক্তিগুলিতে একই নামের বৈশিষ্ট্যগুলিকে ওভাররাইড করবে।
_.extend(destination, *sources)
_.extend({name : 'moe'}, {age : 50});
=> {name : 'moe', age : 50}
ইন Dojo , 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???' });
...
এটি কেবল পুনরাবৃত্তভাবে বস্তুর একটি স্প্লট প্রসারিত করে । এছাড়াও, মনে রাখবেন যে এই পুনরাবৃত্তি ফাংশনটি টিসিও ( টেল-কল অপ্টিমাইজড ) হওয়ায় এটির ফিরে আসা নিজের কাছে শেষ কল।
অতিরিক্তভাবে, আপনি লক্ষ্যযুক্ত বৈশিষ্ট্যগুলি পেতে পারেন । এই ক্ষেত্রে, আপনি উপর ভিত্তি করে অবজেক্টগুলি ঘনীভূত করতে চাইতে পারেন id
,quantity
অথবা অন্য সম্পত্তি। এই পদ্ধতির এটি সম্পর্কে একটি ছোট্ট বই লেখা থাকতে পারে এবং এতে অবজেক্ট-জুস্টেপেজ অবস্থান প্রয়োজন এবং এটি খুব জটিল হয়ে উঠতে পারে। আমি এটির জন্য একটি ছোট লাইব্রেরি লিখেছি যা অনুরোধের ভিত্তিতে পাওয়া যায়।
আশাকরি এটা সাহায্য করবে!
ইয়াহু ইউআই (ওয়াইউআই) এরও এর জন্য একটি সহায়ক ফাংশন রয়েছে:
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);
গভীর কপির জন্য jquery এর একটি বুলিয়ান রয়েছে। আপনি এরকম কিছু করতে পারেন:
MergeRecursive = function(arr1, arr2){
$.extend(true, arr1, arr2);
return arr1;
};
এছাড়াও আপনি মার্জ করতে এন-অ্যারে সমর্থন করতে এই ফাংশনটি সম্পাদনা করতে পারেন।
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);
আমার একটি গভীর-বস্তু-মার্জ করা দরকার। সুতরাং অন্যান্য উত্তরগুলি আমার খুব একটা সহায়তা করে নি। _.কাণ্ড এবং 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 এ অ্যারেগুলিকে মার্জ করতে what। মিমের কী?
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
অ্যাপটি ক্র্যাশ করবে।