İşte benim nesne değişmez:
var obj = {key1: value1, key2: value2};
Nasıl alan ekleyebilir key3
ile value3
nesneye?
İşte benim nesne değişmez:
var obj = {key1: value1, key2: value2};
Nasıl alan ekleyebilir key3
ile value3
nesneye?
Yanıtlar:
Bir nesneye yeni özellikler eklemenin iki yolu vardır :
var obj = {
key1: value1,
key2: value2
};
obj.key3 = "value3";
obj["key3"] = "value3";
İlk form, mülkün adını bildiğinizde kullanılır. İkinci form, özelliğin adı dinamik olarak belirlendiğinde kullanılır. Bu örnekteki gibi:
var getProperty = function (propertyName) {
return obj[propertyName];
};
getProperty("key1");
getProperty("key2");
getProperty("key3");
Bir gerçek JavaScript dizi kullanarak inşa edilebilirler:
var arr = [];
var arr = new Array();
Object.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
length
Özellik bir dizi olmadığı için ayarlanmadı, bir nesne / harita / sözlük.
Object.assign()
Object.assign (dest, src1, src2, ...) nesneleri birleştirir.
dest
Kaynak nesnelerin (ve birçok) özelliklerinin ve değerlerinin üzerine yazar , sonra döndürür dest
.
Object.assign()
Usul, bir hedef nesne, bir ya da daha fazla kaynak nesnelerden her numaralandırılabilir kendi özelliklerinin değerlerini kopyalamak için kullanılır. Hedef nesneyi döndürür.
var obj = {key1: "value1", key2: "value2"};
Object.assign(obj, {key3: "value3"});
document.body.innerHTML = JSON.stringify(obj);
{...}
obj = {...obj, ...pair};
Gönderen MDN'yi :
Sağlanan bir nesneden kendi numaralandırılabilir özelliklerini yeni bir nesneye kopyalar.
Sığ klonlama (prototip hariç) veya nesnelerin birleştirilmesi artık daha kısa bir sözdizimi kullanarak mümkündür
Object.assign()
.Unutmayın, ayarlayıcıları
Object.assign()
tetikler ancak yayılma sözdizimini tetiklemez .
Mevcut Chrome'da ve mevcut Firefox'ta çalışır. Mevcut Edge'de işe yaramadığını söylüyorlar.
var obj = {key1: "value1", key2: "value2"};
var pair = {key3: "value3"};
obj = {...obj, ...pair};
document.body.innerHTML = JSON.stringify(obj);
Nesne atama işleci +=
:
obj += {key3: "value3"};
Hata! Taşındım. Gelecekten bilgi kaçakçılığı yasa dışıdır. Usulüne aykırı!
const
ve let
bunun yerine var
2018 yolu olmalı?
const
çünkü bu avantajı kaldırıyor. Her kullandığımda gelişimi engelledi.
Year 2019 answer ... Opps ...
bölümü bir hak sen benim gün yapılan Teşekkür . En İyi Cevap +1
Daha büyük projeler yazarken LoDash / Underscore'a düşkün oldum .
Eklemek obj['key']
veya obj.key
tümüyle saf JavaScript cevaplarıdır. Bununla birlikte, hem LoDash hem de Undercore kütüphanelerinin her ikisi de, genel olarak Nesneler ve Dizilerle çalışırken birçok ek kullanışlı işlev sağlar.
.push()
Diziler içindir , nesneler için değil .
Ne aradığınıza bağlı olarak, kullanımı ve hissine benzer işlevsellik vermek için iyi olabilecek iki özel işlev vardır arr.push()
. Daha fazla bilgi için dokümanları kontrol edin, orada harika örnekler var.
İkinci nesne üzerine yazılır veya temel nesneye eklenir.
undefined
değerler kopyalanmaz.
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"}
İkinci nesne üzerine yazılır veya temel nesneye eklenir.
undefined
kopyalanacak.
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}
İkinci nesne, yoksa, temel nesneye eklenecek varsayılanlar içerir.
undefined
anahtar zaten varsa değerler kopyalanacaktır.
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"}
Ayrıca, jQuery.extend'den bahsetmeye değer olabilir, _.merge işlevine benzer ve zaten jQuery kullanıyorsanız daha iyi bir seçenek olabilir.
İkinci nesne üzerine yazılır veya temel nesneye eklenir.
undefined
değerler kopyalanmaz.
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"}
Bu zaten böyle bir ES6 / ES2015 polyfill kullanıyorsanız değerinde ES6 / ES2015 Object.assign söz, bu _.merge benzer fonksiyonları ve en iyi seçenek olabilir olabilir Babel isterseniz kendinizi polyfill .
İkinci nesne üzerine yazılır veya temel nesneye eklenir.
undefined
kopyalanacak.
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
çizgi kütüphane hala kullanıyor beri daha evrensel takma adıdır extend
değil merge
. Cevabımı güncelleyeceğim.
Bunlardan herhangi birini kullanabilirsiniz (key3 kullanmak istediğiniz acutal anahtar olduğu sürece)
arr[ 'key3' ] = value3;
veya
arr.key3 = value3;
Key3 bir değişkense, şunları yapmalısınız:
var key3 = 'a_key';
var value3 = 3;
arr[ key3 ] = value3;
Bundan sonra, talep arr.a_key
etmek value3
bir değişmez değeri döndürür 3
.
arr.key3 = value3;
çünkü diziniz gerçekten bir dizi değil ... Bu bir prototip nesnesidir. Gerçek dizi:
var arr = [{key1: value1}, {key2: value2}];
ama yine de doğru değil. Aslında şöyle olmalıdır:
var arr = [{key: key1, value: value1}, {key: key2, value: value2}];
Ve prop2 : 2
bu nesneye eklemek istiyoruz , bunlar en uygun seçenekler:
object.prop2 = 2;
object['prop2'] = 2;
Öyleyse hangisini kullanıyoruz?
Nokta operatörü daha temiz bir sözdizimidir ve varsayılan (imo) olarak kullanılmalıdır. Ancak, nokta operatörü bir nesneye dinamik anahtarlar ekleyemez, bu da bazı durumlarda çok yararlı olabilir. İşte bir örnek:
const obj = {
prop1: 1
}
const key = Math.random() > 0.5 ? 'key1' : 'key2';
obj[key] = 'this value has a dynamic key';
console.log(obj);
2 nesnenin özelliklerini birleştirmek istediğimizde bunlar en uygun seçeneklerdir:
Object.assign()
, hedef nesneyi bağımsız değişken olarak alır ve bir veya daha fazla kaynak nesneyi birleştirir ve bunları birleştirir. Örneğin: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);
Hangisini kullanıyoruz?
Object.assign()
argüman olarak iletilen ve yeni Nesneye atanmadan önce bunları işleyebilen tüm nesnelere erişimimiz var.Bunun için zaten kabul edilmiş bir cevap olduğunu biliyorum ama fikrimi bir yerde belgelediğimi düşündüm. Lütfen [insanlar] en iyi çözüm olup olmadığından emin olmadığım için bu fikirde delik açmaya çekinmeyin ... ama bunu birkaç dakika önce bir araya getirdim:
Object.prototype.push = function( key, value ){
this[ key ] = value;
return this;
}
Bu şekilde kullanabilirsiniz:
var obj = {key1: value1, key2: value2};
obj.push( "key3", "value3" );
Prototip işlevi geri döndüğünden , değişkenleri sonuna this
kadar zincirlemeye devam edebilirsiniz :.push
obj
obj.push(...).push(...).push(...);
Başka bir özellik, push işlevi bağımsız değişkenlerinde değer olarak bir dizi veya başka bir nesne geçirebilmenizdir. Çalışan bir örnek için kemanımı görün: http://jsfiddle.net/7tEme/
TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')
jquery1.9 ile bile jsfiddle'da çalıştığı için garip çünkü
Bugün 2020.01.14 Seçilen çözümler için Chrome v78.0.0, Safari v13.0.4 ve Firefox v71.0.0 üzerinde MacOs HighSierra 10.13.6 üzerinde testler yapıyorum. Çözümü mutable (ilk harf M) ve değişmez (ilk harf I) olarak bölerim. Ayrıca, bu sorunun yanıtlarında henüz yayınlanmamış birkaç değişmez çözüm (IB, IC, ID / IE) sağlıyorum
Sonuçlar
obj.key3 = "abc"
(MA, MB) gibi klasik değişebilir yaklaşım en hızlı{...obj, key3:'abc'}
ve Object.assign
(IA, IB) en hızlıAşağıdaki snippet'te önceden test edilmiş çözüm var, makinenizde testten kaçınabilirsiniz BURAYA
@ Ionuț G. Stan cevabı ile bir sınıf oluşturabilirsiniz.
function obj(){
obj=new Object();
this.add=function(key,value){
obj[""+key+""]=value;
}
this.obj=obj
}
Son sınıfla yeni bir nesne oluşturma:
my_obj=new obj();
my_obj.add('key1', 'value1');
my_obj.add('key2', 'value2');
my_obj.add('key3','value3');
Nesneyi yazdırma
console.log(my_obj.obj) // Return {key1: "value1", key2: "value2", key3: "value3"}
Anahtar Yazdırma
console.log(my_obj.obj["key3"]) //Return value3
Javascript'te yeniyim, yorumlarınızı bekliyoruz. Benim için çalışıyor.
Çoğu cevapta daha önce bahsedilen en çok kullanılan iki yol
obj.key3 = "value3";
obj["key3"] = "value3";
Bir özelliği tanımlamanın bir başka yolu Object.defineProperty () kullanmaktır
Object.defineProperty(obj, 'key3', {
value: "value3", // undefined by default
enumerable: true, // false by default
configurable: true, // false by default
writable: true // false by default
});
Bu yöntem, özelliği tanımlarken daha fazla kontrole sahip olmak istediğinizde kullanışlıdır. Tanımlanan özellik kullanıcı tarafından numaralandırılabilir, yapılandırılabilir ve yazılabilir olarak ayarlanabilir.
tarayıcıların çoğu tarafından desteklenen ve bu çekleri Eklemek istediğiniz mevcut nesne anahtarı varsa ya da olmasın, eğer mevcut bu anahtar değeri mevcut overides ve mevcut o değerle anahtar eklemek
örnek 1
let my_object = {};
// now i want to add something in it
my_object.red = "this is red color";
// { red : "this is red color"}
örnek 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"} }
örnek 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"
// }
// }
Bir Nesnenin içinde birden çok anonim Nesne değişmezine sahipseniz ve anahtar / değer çiftlerini içeren başka bir Nesne eklemek istiyorsanız, bunu yapın:
Nesne Firebug:
console.log(Comicbook);
İadeler:
[Object {name = "Spiderman", değer = "11"}, Object {name = "Marsipulami", değer = "18"}, Nesne {name = "Garfield", değer = "2"}]
Kod:
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"}
Çizgi Roman Nesnesine eklenecek
Yeni çifti ya obj['key3'] = value3
ya obj.key3 = value3
ekler obj
.
Bununla birlikte, jQuery'den bahsedilmediğini biliyorum, ancak kullanıyorsanız, nesneyi ekleyebilirsiniz $.extend(obj,{key3: 'value3'})
. Örneğin:
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. uzanır (hedef [object1] [objectN]) iki içeriğini birleştirir veya daha fazla birinci nesnesine nesneleri birlikte.
Ayrıca, aşağıdakilerle tekrarlanan eklemelere / değişikliklere de izin verir $.extend(true,object1,object2);
:
Bir sonraki Javascript spesifikasyonunda (aday aşama 3) kısa ve zarif bir yol:
obj = { ... obj, ... { key3 : value3 } }
Daha derin bir tartışma Object spread vs Object.assign ve Dr. Axel Rauschmayers sitesinde bulunabilir .
8.6.0 sürümünden beri zaten node.js'de çalışıyor.
Vivaldi, Chrome, Opera ve Firefox'un güncel sürümleri de bu özelliği biliyor, ancak Mirosoft bugüne kadar ne Internet Explorer'da ne de Edge'de bilmiyor.
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);
});
Bunun gibi çıktı: -
[ { 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 } ]
ECMA-262'de ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , P67) tanımlanan Mülk Erişimcilerine göre, mülk eklemenin iki yolu vardır mevcut bir nesne. Bütün bu iki yol, Javascript motoru onlara aynı davranacaktır.
İlk yol nokta gösterimini kullanmaktır:
obj.key3 = value3;
Ancak bu şekilde nokta gösteriminden sonra bir IdentifierName kullanmalısınız .
İkinci yol, parantez gösterimini kullanmaktır:
obj["key3"] = value3;
ve başka bir form:
var key3 = "key3";
obj[key3] = value3;
Bu şekilde, köşeli ayraç gösteriminde bir İfade ( IdentifierName içerir ) kullanabilirsiniz .
Bunu da bu şekilde yapabiliriz.
var myMap = new Map();
myMap.set(0, 'my value1');
myMap.set(1, 'my value2');
for (var [key, value] of myMap) {
console.log(key + ' = ' + value);
}
Bu onun bir geçmiş meselesi ama şimdiki sorunu. Bir çözüm daha öneririm: Sadece anahtarı ve değerleri işleve iletin ve bir harita nesnesi elde edersiniz.
var map = {};
function addValueToMap(key, value) {
map[key] = map[key] || [];
map[key].push(value);
}
{[key]: value}
Sözdizimini kullanarak yeni bir nesne oluşturabilirsiniz :
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
Önceki sözdizimiyle artık {...foo, ...bar}
eski değerinizi değiştirmeden yeni bir nesne eklemek için yayılma sözdizimini kullanabilirsiniz :
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