Bir JavaScript nesnesine nasıl anahtar / değer çifti ekleyebilirim?


1383

İşte benim nesne değişmez:

var obj = {key1: value1, key2: value2};

Nasıl alan ekleyebilir key3ile value3nesneye?


2
JS'de ilişkilendirilebilir dizilerin tüm konusu tuhaf, çünkü bunu yapabilirsiniz ... dreaminginjavascript.wordpress.com/2008/06/27/…
Nosredna

@Nosredna - mesele şu ki, javascript'te ilişkilendirilebilir diziler diye bir şey yoktur. Bu makalede, bir dizi nesnesine nesne özellikleri ekliyor, ancak bunlar gerçekten 'dizinin' bir parçası değil.
UpTheCreek

Koşullu olarak anahtar ayarlamak için bir yol var mı: gelecekteki ES + uygulamaları ile bir nesne değişmezinde değer çiftleri?
Con Antonakos

Yanıtlar:


2253

Bir nesneye yeni özellikler eklemenin iki yolu vardır :

var obj = {
    key1: value1,
    key2: value2
};

Nokta gösterimini kullanma:

obj.key3 = "value3";

Köşeli ayraç gösterimini kullanma:

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:

Array değişmez gösterimi:

var arr = [];

Array yapıcı gösterimi:

var arr = new Array();

4
obj bir nesnedir. Diş telleri arasındaki (ve dahil) kısım değişmez nesnedir. obj bir nesne değişmezi değildir.
Nosredna

24
anahtar bir sayı ise ne olur? obj.123 = 456 çalışmıyor. obj [123] = 456 yine de çalışıyor
axel freudiger

10
@axelfreudiger, sözdizimsel olarak geçerli bir değişken tanımlayıcı olmayan herhangi bir şeyin parantez gösterimiyle kullanılması gerekir.
Ionuț G. Stan

1
@KyleKhalafObject.keys({"b": 1, "c": 3, "a": 2}).sort().forEach(console.log);
Ionuț G. Stan

2
@John: lengthÖzellik bir dizi olmadığı için ayarlanmadı, bir nesne / harita / sözlük.
Ionuț G. Stan

348

2017 yılı yanıtı: Object.assign()

Object.assign (dest, src1, src2, ...) nesneleri birleştirir.

destKaynak 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.

Canlı örnek

var obj = {key1: "value1", key2: "value2"};
Object.assign(obj, {key3: "value3"});

document.body.innerHTML = JSON.stringify(obj);

2018 yılı cevabı: nesne yayma operatörü {...}

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 .

Canlı örnek

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

Yıl 2019 cevabı

Nesne atama işleci += :

obj += {key3: "value3"};

Hata! Taşındım. Gelecekten bilgi kaçakçılığı yasa dışıdır. Usulüne aykırı!


34
obj + = kulağa harika geliyor
Mehrdad Shokri

2
phpstorm kullanılmasını önerir constve letbunun yerine var2018 yolu olmalı?
jim smith

@jimsmith: Bunu neden burada söylediğinden emin değilim. Fikrimi ister misin? Bir tercümanın avantajı, konsolda canlı olan her şeyi değiştirme yeteneğidir. Bunu sevmiyorum constçünkü bu avantajı kaldırıyor. Her kullandığımda gelişimi engelledi.
7vujy0f0hy

2019'dayız, bu atama operatörünün yayılmış operatörün yerini almak için zaten kullanılabileceği anlamına mı geliyor?
Mr-Programs

2
Gerçek bir programcı, stresli bir mesleğe rahatlama sağlamak için biraz eğlenceye değer verecektir. Sizin Year 2019 answer ... Opps ...bölümü bir hak sen benim gün yapılan Teşekkür . En İyi Cevap +1
ColinWa

89

Daha büyük projeler yazarken LoDash / Underscore'a düşkün oldum .

Eklemek obj['key']veya obj.keytü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.

_. birleştirme (yalnızca Lodash)

İkinci nesne üzerine yazılır veya temel nesneye eklenir. undefineddeğ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"} 

_.uzunluk / _. atama

İkinci nesne üzerine yazılır veya temel nesneye eklenir. undefinedkopyalanacak.

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}

_.defaults

İkinci nesne, yoksa, temel nesneye eklenecek varsayılanlar içerir. undefinedanahtar 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"}

$ .extend

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. undefineddeğ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"}

Object.assign ()

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. undefinedkopyalanacak.

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}

_.Merge şimdi _.extend olduğuna inanıyorum (hedef, diğerleri)
AD

Ah, doğru konum, _.extendçizgi kütüphane hala kullanıyor beri daha evrensel takma adıdır extenddeğil merge. Cevabımı güncelleyeceğim.
Sir.Nathan Stassen

66

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_keyetmek value3bir değişmez değeri döndürür 3.


7
Bu bir dizi değil, bir nesne. JS dizileri yalnızca tamsayı ile dizine eklenir. Arr.length yapmaya çalışın ve 0 döndürecektir. Bununla
DevAntoine

@ DevAntoine bağlantısına erişilemiyor. Bu dizi türünün "uzunluğunu" almak istiyorsanız, şunu kullanın: Object.keys (your_array) .length Bu sorun hakkında daha fazla bilgi için, bkz: stackoverflow.com/questions/21356880/array-length-returns-0
Thế Anh Nguy

Ayrıca oluşturdukları dizinin length özelliğinin üzerine basitçe yazılabilir. Ayar var myarray ["length"] = numArrayFields bu sorunu benim için çözdü. Dizinize eklediğiniz alan sayısını bir şekilde izlediğinizi varsayarsak.
John Smith

30
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}];

25
var employees = []; 
employees.push({id:100,name:'Yashwant',age:30});
employees.push({id:200,name:'Mahesh',age:35});

22
Bu nesneler için değil, diziler içindir.
Roly

12

Sadece özellikler eklemek:

Ve prop2 : 2bu nesneye eklemek istiyoruz , bunlar en uygun seçenekler:

  1. Nokta operatörü: object.prop2 = 2;
  2. köşeli parantez: 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);

Nesneleri birleştirme:

2 nesnenin özelliklerini birleştirmek istediğimizde bunlar en uygun seçeneklerdir:

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

  1. Nesne yayma işleci ...

const obj = {
  prop1: 1,
  prop2: 2
}

const newObj = {
  ...obj,
  prop3: 3,
  prop4: 4
}

console.log(newObj);

Hangisini kullanıyoruz?

  • Forma sözdizimi daha az ayrıntılıdır ve varsayılan imo olarak kullanılmalıdır. Bu sözdizimini tüm tarayıcılar tarafından desteklenen sözdizimine aktarmayı unutmayın, çünkü nispeten yenidir.
  • Object.assign() argüman olarak iletilen ve yeni Nesneye atanmadan önce bunları işleyebilen tüm nesnelere erişimimiz var.

1
Gönderinizin en üstünde: Kıvırcık parantezler değil köşeli parantezler.
Bram Vanroy

11

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 thiskadar zincirlemeye devam edebilirsiniz :.pushobjobj.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/


belki de bu iyi bir çözüm değildir, jquery1.9'da hatalar alıyorum: TypeError: 'undefined' is not a function (evaluating 'U[a].exec(s)')jquery1.9 ile bile jsfiddle'da çalıştığı için garip çünkü
sadmicrowave 26:13

3
Object.prototype; bu, JavaScript'in "ve" hashtables olarak nesne "özelliğini (ve daha sonra Google Maps JS API gibi birçok kütüphaneyi) kırar. Tartışmaya bakın: stackoverflow.com/questions/1827458/…
Justin R.

11

Verim

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

  • en hızlı değiştirilebilir çözümler, en hızlı değiştirilemeyenlerden (> 10x) çok daha hızlıdır
  • obj.key3 = "abc"(MA, MB) gibi klasik değişebilir yaklaşım en hızlı
  • değişmez çözümler için {...obj, key3:'abc'}ve Object.assign(IA, IB) en hızlı
  • şaşırtıcı bir şekilde krom (MC-IA) ve safari (MD-IB) için bazı değişken çözümlerden daha hızlı değişmez çözümler var

resim açıklamasını buraya girin

ayrıntılar

Aşağıdaki snippet'te önceden test edilmiş çözüm var, makinenizde testten kaçınabilirsiniz BURAYA

resim açıklamasını buraya girin


9

@ 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.


7

Ç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.


6

Örneğiniz bir Dizi değil bir Nesne gösterir. Bu durumda, bir Nesneye alan eklemenin tercih edilen yolu, ona sadece atamaktır, şöyle:

arr.key3 = value3;

6

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

5

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


güzel ve açık bir şekilde bir id veya name özelliği olan nesneleri adreslemek için daha uygun olan eklerken atama, daha iyi olan diğer seçenek açıkladı. özellikle daha fazla sahne olduğunda veya sahip olabilirken aynı yöntem sadece başka bir koma koyar ve planlardaki değişikliğe hazır olur
Avia Afer

5

Yeni çifti ya obj['key3'] = value3ya obj.key3 = value3ekler 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);:


5

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.


5
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 } ]

4

Bunu şu şekilde ekleyebilirsiniz:

arr['key3'] = value3;

veya bu şekilde:

arr.key3 = value3;

Değişkenle nesnesine anahtarlama düşündüren cevaplar key3değeri ise sadece çalışacak key3oldu 'key3'.


4

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 .


4

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

1

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

2
Bu hiç sorulan soru ile ilgili görünmüyor.
Quentin

0

İçin prepend bir nesne için bir anahtar-değer çifti böylece de için o eleman ile eserlerin ilk bunu:

    var nwrow = {'newkey': 'value' };
    for(var column in row){
        nwrow[column] = row[column];
    }
    row = nwrow;

0

Bunu başarmanın en iyi yolu aşağıda belirtilmiştir:

function getKey(key) {
  return `${key}`;
}

var obj = {key1: "value1", key2: "value2", [getKey('key3')]: "value3"};

//console.log(obj);

0

{[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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.