यहाँ मेरी वस्तु शाब्दिक है:
var obj = {key1: value1, key2: value2};
मैं ऑब्जेक्ट के key3
साथ फ़ील्ड कैसे जोड़ सकता हूं value3
?
यहाँ मेरी वस्तु शाब्दिक है:
var obj = {key1: value1, key2: value2};
मैं ऑब्जेक्ट के key3
साथ फ़ील्ड कैसे जोड़ सकता हूं value3
?
जवाबों:
किसी वस्तु में नए गुण जोड़ने के दो तरीके हैं :
var obj = {
key1: value1,
key2: value2
};
obj.key3 = "value3";
obj["key3"] = "value3";
प्रॉपर्टी का नाम पता होने पर पहले फॉर्म का इस्तेमाल किया जाता है। दूसरे रूप का उपयोग तब किया जाता है जब संपत्ति का नाम गतिशील रूप से निर्धारित होता है। इस उदाहरण में पसंद करें:
var getProperty = function (propertyName) {
return obj[propertyName];
};
getProperty("key1");
getProperty("key2");
getProperty("key3");
एक वास्तविक जावास्क्रिप्ट सरणी का निर्माण किया जा सकता है:
var arr = [];
var arr = new Array();
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
length
संपत्ति सेट नहीं है क्योंकि यह एक सरणी नहीं है, यह एक वस्तु / नक्शा / शब्दकोश है।
Object.assign()
Object.assign (dest, src1, src2, ...) ऑब्जेक्ट्स को मर्ज करता है।
यह dest
(हालांकि कई) स्रोत वस्तुओं के गुणों और मूल्यों के साथ ओवरराइट करता है, फिर लौटता है dest
।
Object.assign()
विधि लक्ष्य वस्तु के लिए एक या अधिक स्रोत वस्तुओं से सभी गणनीय खुद गुण के मूल्यों की प्रतिलिपि करने के लिए किया जाता है। यह लक्ष्य वस्तु को लौटा देगा।
var obj = {key1: "value1", key2: "value2"};
Object.assign(obj, {key3: "value3"});
document.body.innerHTML = JSON.stringify(obj);
{...}
obj = {...obj, ...pair};
से MDN :
यह एक नई वस्तु पर प्रदान की गई वस्तु से खुद के अनगिनत गुणों को कॉपी करता है।
उथला-क्लोनिंग (प्रोटोटाइप को छोड़कर) या वस्तुओं के विलय से अब एक छोटे वाक्यविन्यास का उपयोग करना संभव है
Object.assign()
।ध्यान दें कि
Object.assign()
चलाता setters जबकि प्रसार वाक्य रचना नहीं करता है।
यह वर्तमान क्रोम और वर्तमान फ़ायरफ़ॉक्स में काम करता है। वे कहते हैं कि यह वर्तमान एज में काम नहीं करता है।
var obj = {key1: "value1", key2: "value2"};
var pair = {key3: "value3"};
obj = {...obj, ...pair};
document.body.innerHTML = JSON.stringify(obj);
ऑब्जेक्ट असाइनमेंट ऑपरेटर +=
:
obj += {key3: "value3"};
उफ़ ... मैं बह गया। भविष्य से तस्करी की जानकारी अवैध है। विधिवत रूप से अस्पष्ट!
const
और let
इसके बजाय var
, 2018 का तरीका होना चाहिए?
const
क्योंकि यह उस लाभ को दूर करता है। हर बार जब मैंने इसका इस्तेमाल किया, तो इससे विकास बाधित हुआ।
Year 2019 answer ... Opps ...
भाग धन्यवाद का पात्र है , आपने मेरा दिन बना दिया । सर्वश्रेष्ठ उत्तर +1
मैं बड़ा प्रोजेक्ट लिखते समय LoDash / अंडरस्कोर के शौकीन हो गए हैं।
जोड़कर obj['key']
या obj.key
सभी ठोस शुद्ध जावास्क्रिप्ट उत्तर हैं। हालाँकि, दोनों LoDash और Underscore लाइब्रेरी सामान्य रूप से ऑब्जेक्ट्स और Arrays के साथ काम करते समय कई अतिरिक्त सुविधाजनक कार्य प्रदान करते हैं।
.push()
Arrays के लिए है , वस्तुओं के लिए नहीं ।
आप जिस चीज की तलाश कर रहे हैं, उसके आधार पर, दो विशिष्ट कार्य हैं जो उपयोग करने के लिए अच्छा हो सकते हैं और महसूस करने के लिए कार्यक्षमता के समान दे सकते हैं arr.push()
। अधिक जानकारी के लिए डॉक्स की जांच करें, उनके पास कुछ बेहतरीन उदाहरण हैं।
दूसरी वस्तु आधार ऑब्जेक्ट को अधिलेखित या जोड़ देगी।
undefined
मूल्यों की नकल नहीं की जाती है।
var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
_.merge(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3"}
दूसरी वस्तु आधार ऑब्जेक्ट को अधिलेखित या जोड़ देगी।
undefined
नकल होगी।
var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
_.extend(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3", key4: undefined}
यदि वे मौजूद नहीं हैं तो दूसरी ऑब्जेक्ट में डिफॉल्ट होते हैं जिन्हें आधार ऑब्जेक्ट में जोड़ा जाएगा।
undefined
यदि कुंजी पहले से मौजूद है, तो मूल्यों की प्रतिलिपि बनाई जाएगी।
var obj = {key3: "value3", key5: "value5"};
var obj2 = {key1: "value1", key2:"value2", key3: "valueDefault", key4: "valueDefault", key5: undefined};
_.defaults(obj, obj2);
console.log(obj);
// → {key3: "value3", key5: "value5", key1: "value1", key2: "value2", key4: "valueDefault"}
इसके अलावा, यह jQuery.extend का उल्लेख करने योग्य हो सकता है, यह _.merge के समान कार्य करता है और यदि आप पहले से ही jQuery का उपयोग कर रहे हैं तो यह एक बेहतर विकल्प हो सकता है।
दूसरी वस्तु आधार ऑब्जेक्ट को अधिलेखित या जोड़ देगी।
undefined
मूल्यों की नकल नहीं की जाती है।
var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
$.extend(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3"}
यह ES6 / ES2015 Object.assign उल्लेख के लायक है, यह _.merge के समान कार्य और सबसे अच्छा विकल्प हो सकता है अगर आप पहले से ही एक ES6 / ES2015 polyfill की तरह प्रयोग कर रहे हैं हो सकता है कोलाहल यदि आप चाहते हैं अपने आप को polyfill ।
दूसरी वस्तु आधार ऑब्जेक्ट को अधिलेखित या जोड़ देगी।
undefined
नकल होगी।
var obj = {key1: "value1", key2: "value2"};
var obj2 = {key2:"value4", key3: "value3", key4: undefined};
Object.assign(obj, obj2);
console.log(obj);
// → {key1: "value1", key2: "value4", key3: "value3", key4: undefined}
_.extend
एक अधिक सार्वभौमिक उपनाम है क्योंकि अंडरस्कोर लाइब्रेरी अभी भी उपयोग extend
नहीं कर रहा है merge
। मैं अपना जवाब अपडेट करूंगा।
आप इनमें से किसी एक का उपयोग कर सकते हैं (बशर्ते की 3 एक्यूट कुंजी है जिसे आप उपयोग करना चाहते हैं)
arr[ 'key3' ] = value3;
या
arr.key3 = value3;
यदि की 3 एक चर है, तो आपको यह करना चाहिए:
var key3 = 'a_key';
var value3 = 3;
arr[ key3 ] = value3;
इसके बाद, अनुरोध करने arr.a_key
पर value3
, एक शाब्दिक मूल्य वापस आ जाएगा 3
।
arr.key3 = value3;
क्योंकि आपकी गिरफ्तारी वास्तव में एक सरणी नहीं है ... यह एक प्रोटोटाइप ऑब्जेक्ट है। वास्तविक सरणी होगी:
var arr = [{key1: value1}, {key2: value2}];
लेकिन यह अभी भी सही नहीं है। यह वास्तव में होना चाहिए:
var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
और हम prop2 : 2
इस ऑब्जेक्ट में जोड़ना चाहते हैं, ये सबसे सुविधाजनक विकल्प हैं:
object.prop2 = 2;
object['prop2'] = 2;
तो हम कौन सा उपयोग करते हैं?
डॉट ऑपरेटर अधिक स्वच्छ वाक्यविन्यास है और इसे डिफ़ॉल्ट (imo) के रूप में उपयोग किया जाना चाहिए। हालांकि, डॉट ऑपरेटर किसी ऑब्जेक्ट में डायनेमिक कुंजियों को जोड़ने में सक्षम नहीं है, जो कुछ मामलों में बहुत उपयोगी हो सकता है। यहाँ एक उदाहरण है:
const obj = {
prop1: 1
}
const key = Math.random() > 0.5 ? 'key1' : 'key2';
obj[key] = 'this value has a dynamic key';
console.log(obj);
जब हम 2 वस्तुओं के गुणों को मिलाना चाहते हैं तो ये सबसे सुविधाजनक विकल्प हैं:
Object.assign()
, एक लक्ष्य वस्तु को एक तर्क के रूप में लेता है, और एक या अधिक स्रोत ऑब्जेक्ट और उन्हें एक साथ मर्ज करेगा। उदाहरण के लिए:const object1 = {
a: 1,
b: 2,
};
const object2 = Object.assign({
c: 3,
d: 4
}, object1);
console.log(object2);
...
const obj = {
prop1: 1,
prop2: 2
}
const newObj = {
...obj,
prop3: 3,
prop4: 4
}
console.log(newObj);
हम कौन सा उपयोग करते हैं?
Object.assign()
अधिक गतिशील है क्योंकि हमारे पास सभी वस्तुओं तक पहुंच है जो तर्क के रूप में पारित हो जाते हैं और नई वस्तु को सौंपे जाने से पहले उन्हें हेरफेर कर सकते हैं।मुझे पता है कि इसके लिए पहले से ही एक स्वीकृत उत्तर है, लेकिन मैंने सोचा कि मैं अपने विचार को कहीं दस्तावेज करूँगा। कृपया [लोग] इस विचार में छेद करने के लिए स्वतंत्र महसूस करें, क्योंकि मुझे यकीन नहीं है कि यह सबसे अच्छा समाधान है ... लेकिन मैंने इसे कुछ मिनट पहले एक साथ रखा था:
Object.prototype.push = function( key, value ){
this[ key ] = value;
return this;
}
आप इसे इस तरह से उपयोग करेंगे:
var obj = {key1: value1, key2: value2};
obj.push( "key3", "value3" );
चूंकि, प्रोटोटाइप फ़ंक्शन वापस आ रहा है this
आप .push
अपने obj
चर के अंत तक श्रृंखला जारी रख सकते हैं :obj.push(...).push(...).push(...);
एक अन्य विशेषता यह है कि आप एक फ़ंक्शन या किसी अन्य ऑब्जेक्ट को पुश फ़ंक्शन के तर्क में मान के रूप में पास कर सकते हैं। एक कामकाजी उदाहरण के लिए मेरी फिडेल देखें: http://jsfiddle.net/7tEme/
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
जो अजीब है क्योंकि यह jqufiddle में jquery1.9 के साथ भी काम करता है
आज 2020.01.14 मैं चुने हुए समाधानों के लिए Chrome v78.0.0, Safari v13.0.4 और Firefox v71.0.0 पर MacOs HighSierra 10.13.6 पर परीक्षण करता हूं। मैं उत्परिवर्तनीय (प्रथम अक्षर M) और अपरिवर्तनीय (पहला अक्षर I) के समाधानों को विभाजित करता हूं। मैं कुछ अपरिवर्तनीय समाधान भी प्रदान करता हूं (आईबी, आईसी, आईडी / आईई) अभी तक इस प्रश्न के उत्तर में प्रकाशित नहीं हुआ है
निष्कर्ष
obj.key3 = "abc"
(MA, MB) सबसे तेज है{...obj, key3:'abc'}
और Object.assign
IA, IB) सबसे तेज़ हैंनीचे दिए गए स्निपेट में, निर्धारित परीक्षण समाधान हैं, आप अपनी मशीन पर परीक्षण कर सकते हैं यहां
आप @ Ionu Stan G. Stan के उत्तर के साथ एक वर्ग बना सकते हैं
function obj(){
obj=new Object();
this.add=function(key,value){
obj[""+key+""]=value;
}
this.obj=obj
}
अंतिम वर्ग के साथ एक नई वस्तु बनाना:
my_obj=new obj();
my_obj.add('key1', 'value1');
my_obj.add('key2', 'value2');
my_obj.add('key3','value3');
वस्तु को छापना
console.log(my_obj.obj) // Return {key1: "value1", key2: "value2", key3: "value3"}
एक कुंजी मुद्रण
console.log(my_obj.obj["key3"]) //Return value3
मैं जावास्क्रिप्ट में नौसिखिया हूँ, टिप्पणियों का स्वागत है। मेरे लिये कार्य करता है।
अधिकांश उत्तर में पहले से वर्णित दो सबसे अधिक उपयोग किए जाने वाले तरीके
obj.key3 = "value3";
obj["key3"] = "value3";
एक संपत्ति को परिभाषित करने का एक और तरीका Object.defineProperty () का उपयोग कर रहा है
Object.defineProperty(obj, 'key3', {
value: "value3", // undefined by default
enumerable: true, // false by default
configurable: true, // false by default
writable: true // false by default
});
यह विधि तब उपयोगी होती है जब आप संपत्ति को परिभाषित करते समय अधिक नियंत्रण रखना चाहते हैं। परिभाषित संपत्ति को उपयोगकर्ता द्वारा गणना करने योग्य, विन्यास योग्य और योग्य बनाया जा सकता है।
अधिकांश ब्राउज़रों द्वारा समर्थित, और यह जाँचता है कि क्या ऑब्जेक्ट कुंजी उपलब्ध है या आप जोड़ना नहीं चाहते हैं, यदि उपलब्ध है तो यह मौजूदा कुंजी मान से अधिक है और यह उपलब्ध नहीं है यह मान के साथ कुंजी जोड़ता है
उदाहरण 1
let my_object = {};
// now i want to add something in it
my_object.red = "this is red color";
// { red : "this is red color"}
उदाहरण 2
let my_object = { inside_object : { car : "maruti" }}
// now i want to add something inside object of my object
my_object.inside_object.plane = "JetKing";
// { inside_object : { car : "maruti" , plane : "JetKing"} }
उदाहरण 3
let my_object = { inside_object : { name : "abhishek" }}
// now i want to add something inside object with new keys birth , gender
my_object.inside_object.birth = "8 Aug";
my_object.inside_object.gender = "Male";
// { inside_object :
// { name : "abhishek",
// birth : "8 Aug",
// gender : "Male"
// }
// }
यदि आपके पास एक वस्तु के अंदर कई अनाम वस्तु शाब्दिक हैं, तो कुंजी / मान जोड़े वाले किसी अन्य ऑब्जेक्ट को जोड़ना चाहते हैं, यह करें:
फायरबग द ऑब्जेक्ट:
console.log(Comicbook);
रिटर्न:
[ऑब्जेक्ट {नाम = "स्पाइडरमैन", मूल्य = "11"}, ऑब्जेक्ट {नाम = "मार्सिपुलमी", मूल्य = "18"}, ऑब्जेक्ट {नाम = "गारफील्ड", मूल्य = "2"}]
कोड:
if (typeof Comicbook[3]=='undefined') {
private_formArray[3] = new Object();
private_formArray[3]["name"] = "Peanuts";
private_formArray[3]["value"] = "12";
}
Object {name="Peanuts", value="12"}
कॉमिकबुक ऑब्जेक्ट में जोड़ देगा
या तो obj['key3'] = value3
या obj.key3 = value3
करने के लिए नए जोड़ी जोड़ देगा obj
।
हालाँकि, मुझे पता है कि jQuery का उल्लेख नहीं किया गया था, लेकिन यदि आप इसका उपयोग कर रहे हैं, तो आप ऑब्जेक्ट को इसके माध्यम से जोड़ सकते हैं $.extend(obj,{key3: 'value3'})
। उदाहरण के लिए:
var obj = {key1: 'value1', key2: 'value2'};
$('#ini').append(JSON.stringify(obj));
$.extend(obj,{key3: 'value3'});
$('#ext').append(JSON.stringify(obj));
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<p id="ini">Initial: </p>
<p id="ext">Extended: </p>
jQuery। विस्तार (लक्ष्य [, object1] [, objectN]) दो या दो से अधिक वस्तुओं की सामग्री को पहली वस्तु में एक साथ मिला देता है।
और इसके साथ पुनरावर्ती जोड़ / संशोधन की भी अनुमति देता है $.extend(true,object1,object2);
:
अगले जावास्क्रिप्ट विनिर्देश (उम्मीदवार चरण 3) में एक छोटा और सुरुचिपूर्ण तरीका है:
obj = { ... obj, ... { key3 : value3 } }
डॉ। एक्सल रौशमैयर्स साइट पर ऑब्जेक्ट स्प्रेड ऑब्जेक्ट ऑब्जेक्ट में गहरी खोज की जा सकती है ।
यह 8.6.0 रिलीज से पहले ही नोड.जेएस में काम करता है।
विवाल्डी, क्रोम, ओपेरा और फ़ायरफ़ॉक्स रिलीज़ होने की तारीख में भी इस सुविधा को जानते हैं, लेकिन Mirosoft आज तक नहीं है, न तो Internet Explorer में और न ही एज में।
var arrOfObj = [{name: 'eve'},{name:'john'},{name:'jane'}];
var injectObj = {isActive:true, timestamp:new Date()};
// function to inject key values in all object of json array
function injectKeyValueInArray (array, keyValues){
return new Promise((resolve, reject) => {
if (!array.length)
return resolve(array);
array.forEach((object) => {
for (let key in keyValues) {
object[key] = keyValues[key]
}
});
resolve(array);
})
};
//call function to inject json key value in all array object
injectKeyValueInArray(arrOfObj,injectObj).then((newArrOfObj)=>{
console.log(newArrOfObj);
});
इस तरह का आउटपुट: -
[ { name: 'eve',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'john',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z },
{ name: 'jane',
isActive: true,
timestamp: 2017-12-16T16:03:53.083Z } ]
ईसीएमए -262 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf में परिभाषित संपत्ति एक्सेसर्स के अनुसार , P67) को जोड़ने के लिए आप दो तरीके अपना सकते हैं। मौजूद वस्तु। इन सभी दो तरह से, जावास्क्रिप्ट इंजन उन्हें एक ही व्यवहार करेगा।
पहला तरीका डॉट नोटेशन का उपयोग करना है:
obj.key3 = value3;
लेकिन इस तरह, आपको एक पहचानकर्ता का उपयोग करना चाहिए डॉट नोटेशन के बाद ।
दूसरा तरीका ब्रैकेट नोटेशन का उपयोग करना है:
obj["key3"] = value3;
और दूसरा रूप:
var key3 = "key3";
obj[key3] = value3;
इस तरह, आप ब्रैकेट अंकन में एक अभिव्यक्ति ( पहचानकर्ता शामिल करें ) का उपयोग कर सकते हैं ।
हम इस तरह से भी कर सकते हैं।
var myMap = new Map();
myMap.set(0, 'my value1');
myMap.set(1, 'my value2');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
चूंकि यह अतीत का सवाल है, लेकिन वर्तमान की समस्या। एक और समाधान सुझाएगा: फ़ंक्शन के लिए बस कुंजी और मान पास करें और आपको एक मानचित्र ऑब्जेक्ट मिलेगा।
var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
आप {[key]: value}
वाक्य रचना का उपयोग करके एक नई वस्तु बना सकते हैं :
const foo = {
a: 'key',
b: 'value'
}
const bar = {
[foo.a]: foo.b
}
console.log(bar); // {key: 'value'}
console.log(bar.key); // value
const baz = {
['key2']: 'value2'
}
console.log(baz); // {key2: 'value2'}
console.log(baz.key2); // value2
पिछले सिंटैक्स के साथ अब आप {...foo, ...bar}
अपने पुराने मान को म्यूट किए बिना किसी नए ऑब्जेक्ट को जोड़ने के लिए फैल सिंटैक्स का उपयोग कर सकते हैं :
const foo = {a: 1, b: 2};
const bar = {...foo, ...{['c']: 3}};
console.log(bar); // {a: 1, b: 2, c: 3}
console.log(bar.c); // 3