Bir nesneye ekleme


156

Ben uyarıları ve onlar hakkında bazı bilgileri tutan bir nesne var:

var alerts = { 
    1: { app: 'helloworld', message: 'message' },
    2: { app: 'helloagain', message: 'another message' }
}

Buna ek olarak, kaç uyarı olduğunu söyleyen bir değişkenim var alertNo. Sorum şu: Yeni bir uyarı eklemeye gittiğimde, uyarıyı alertsnesneye eklemenin bir yolu var mı?


6
Gönderilen json: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', mesaj: 'bir mesaj'} ile ilgili bir sorununuz olduğunu düşünüyorum?
Andreas Grech

Yanıtlar:


235

Uyarıları tek bir nesnenin özellikleri yerine bir dizide kayıt olarak depolamaya ne dersiniz?

var alerts = [ 
    {num : 1, app:'helloworld',message:'message'},
    {num : 2, app:'helloagain',message:'another message'} 
]

Ve sonra bir tane eklemek için şunu kullanın push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});

1
Bu yanıt eklenecek uyarının kimliğini bilmenizi bekliyor. Zaten biliyoruz buysa, o zaman sadece orijinal nesne biçimi izler ve bunu yapabilirsiniz: alerts[3] = { app: 'hello3', message: 'message 3' }. Bu ile kimliği belirtilen mesaj erişebilirsiniz: alerts[2] => { app: 'helloworld', message: 'message' }. O zaman uzunluk elde etmek sadece: Object.keys(alerts).length( dizilerle bu bit daha kolay)
Matt

61

jQuery $.extend(obj1, obj2)sizin için 2 nesneyi birleştirir, ancak gerçekten bir dizi kullanıyor olmalısınız.

var alertsObj = {
    1: {app:'helloworld','message'},
    2: {app:'helloagain',message:'another message'}
};

var alertArr = [
    {app:'helloworld','message'},
    {app:'helloagain',message:'another message'}
];

var newAlert = {app:'new',message:'message'};

$.extend(alertsObj, newAlert);
alertArr.push(newAlert);

JQuery'nin kapsamı yavaş: trevmex.com/post/2531629773/jquerys-extend-is-slow . Ayrıca, bir yazım hatası var. $ .extends (), $ .extend () öğesini okumalıdır.
ken

Yazım hatası ile iyi yakalamak. $ .Extends'in yararlı olduğu durumlar vardır, ancak mümkün olduğunda kaçınılması gerektiği konusunda haklısınız.
respectTheCode

1
Bence length () sadece bir kayıt yapınız varsa, parantez olmadan tamam, geri kalanı için respectTheCode ile katılıyorum, sadece push () kullanın
elvenbyte

39

Bunu Object.assign () ile yapabilirsiniz . Bazen bir diziye ihtiyacınız vardır, ancak tek bir JSON nesnesi (OData çağrısı gibi) bekleyen işlevlerle çalışırken, bu yöntemi yalnızca paketini açmak için bir dizi oluşturmaktan daha basit buldum.

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

alerts = Object.assign({3: {app:'helloagain_again',message:'yet another message'}}, alerts)

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "helloagain_again",message: "yet another message"}
} 

DÜZENLEME: Bir sonraki anahtarı almayla ilgili yorumu ele almak için, Object.keys () işleviyle bir dizi anahtar alabilirsiniz - anahtarı arttırma örneği için Vadi'nin cevabına bakın. Benzer şekilde, tüm değerleri Object.values ​​() ile ve anahtar / değer çiftlerini Object.entries () ile alabilirsiniz .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]

7
Diğerleri nesneyi diziye dönüştürmeye atıfta bulunduğundan aslında bu doğru cevaptır, ancak bu şekilde nesne olarak saklıyorsunuz. Yazar söz konusu olduğunda, dizilerle çalışmasının daha iyi olması mümkündür, ancak bu bir nesneye nasıl ekleneceğinin cevabı olacaktır.
Goran Jakovljevic

2
evet katılıyorum .. Söz konusu nesne bir dizi sadece onun bir nesne bu yüzden bu mükemmel bir cevap!
Kishan Oza

Bu doğru cevap; hangi dizine yeni nesne ekleyeceğinizi nasıl bilebilirsiniz?
Capan

1
bu başlık sorunun cevabıdır.
FistOfFury

12

Spread sözdizimini aşağıdaki gibi kullanabilirsiniz.

var alerts = { 
1: { app: 'helloworld', message: 'message' },
2: { app: 'helloagain', message: 'another message' }
 }

alerts = {...alerts, 3: {app: 'hey there', message: 'another message'} }

11

Belirtilen diğer cevaplar gibi, bir dizi ile çalışmayı daha kolay bulabilirsiniz.

Değilse:

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}

// Get the current size of the object
size = Object.keys(alerts).length

//add a new alert 
alerts[size + 1] = {app:'Your new app', message:'your new message'}

//Result:
console.log(alerts)
{ 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
    3: {app: "Another hello",message: "Another message"}
}      

dene:

https://jsbin.com/yogimo/edit?js,console


Uyarıları sildiyseniz veya bir anahtarı atladıysanız bu çalışmaz. Sen çizgisinde bir şey eklemek gerekir while(alerts[size]) size++;Ve muhtemelen adlandırmak sizeiçin newId.
kadar

7

Şimdi ES6 ile bu işi çok kolaylaştıran çok güçlü bir yayılma operatörünüz (... Nesne) var. Aşağıdaki gibi yapılabilir:

let alerts = { 
   1: { app: 'helloworld', message: 'message' },
   2: { app: 'helloagain', message: 'another message' }
} 

//now suppose you want to add another key called alertNo. with value 2 in the alerts object. 

alerts = {
   ...alerts,
   alertNo: 2
 }

Bu kadar. İstediğiniz anahtarı ekleyecektir. Bu yardımcı olur umarım!!


6

Gerçekten uyarı önerileri dizisi ile gitmek gerekir, ancak aksi takdirde bahsettiğiniz nesneye eklemek şöyle görünecektir:

alerts[3]={"app":"goodbyeworld","message":"cya"};

Ancak, adların her şeyi alıntıladığı ve gittiği gibi gerçek sayıları kullanmamalısınız.

alerts['3']={"app":"goodbyeworld","message":"cya"};

veya bir nesne dizisi haline getirebilirsiniz.

Erişmek şöyle görünüyor

alerts['1'].app
=> "helloworld"

5

En dıştaki yapıyı bir diziye değiştirme olanağınız var mı? Yani böyle görünecek

var alerts = [{"app":"helloworld","message":null},{"app":"helloagain","message":"another message"}];

Yani bir tane eklemeniz gerektiğinde, onu diziye itebilirsiniz

alerts.push( {"app":"goodbyeworld","message":"cya"} );

Ardından, hataların nasıl numaralandırılacağına ilişkin yerleşik bir sıfır tabanlı dizine sahipsiniz.


2

ES6 ile çok daha kolay:

let exampleObj = {
  arg1: {
    subArg1: 1,
    subArg2: 2,
  },
  arg2: {
    subArg1: 1,
    subArg2: 2,
  }
};

exampleObj.arg3 = {
  subArg1: 1,
  subArg2: 2,
};

console.log(exampleObj);

{
arg1: {subArg1: 1, subArg2: 2}
arg2: {subArg1: 1, subArg2: 2}
arg3: {subArg1: 1, subArg2: 2}
}

0

Alternatif olarak, ES6'da yayılım sözdizimi kullanılabilir. uyarı için bir ${Object.keys(alerts).length + 1}sonrakine döner id.

let alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
};

alerts = {
  ...alerts, 
  [`${Object.keys(alerts).length + 1}`]: 
  { 
    app: `helloagain${Object.keys(alerts).length + 1}`,message: 'next message' 
  } 
};

console.log(alerts);


0

Üzgünüm ama zaten itibarım nedeniyle cevaplarınızı yorumlayamıyorum! ... yani, nesnenizin yapısını değiştirmek istiyorsanız, Thane Plummer'ın dediği gibi yapmalısınız , ancak nerede umursamıyorsanız küçük bir numara öğeyi koymak için: ekleme için numara belirtmezseniz, ilk konuma eklenir.

Örneğin, bir Json nesnesini bir mongoDB işlev çağrısına geçirmek ve aldığınız koşullara yeni bir anahtar eklemek istiyorsanız bu harika bir özelliktir. Bu durumda, kodumun içindeki bir değişkenten bazı bilgiler içeren bir myUid öğesi ekleyeceğim:

// From backend or anywhere
let myUid = { _id: 'userid128344'};
// ..
// ..

  let myrequest = { _id: '5d8c94a9f629620ea54ccaea'};
  const answer = findWithUid( myrequest).exec();

// ..
// ..

function findWithUid( conditions) {
  const cond_uid = Object.assign({uid: myUid}, conditions);
  // the object cond_uid now is:
  // {uid: 'userid128344', _id: '5d8c94a9f629620ea54ccaea'}
  // so you can pass the new object Json completly with the new key
  return myModel.find(cond_uid).exec();
}


0

[Javascript] Bir parça jiggery pokery'den sonra, bu benim için çalıştı:

 let dateEvents = (
            {
                'Count': 2,
                'Items': [
                    {
                        'LastPostedDateTime': {
                            "S": "10/16/2019 11:04:59"
                        }
                    },
                    {
                        'LastPostedDateTime': {
                            "S": "10/30/2019 21:41:39"
                        }
                    }
                ],
            }
        );
        console.log('dateEvents', dateEvents);

Çözmem gereken sorun olayların herhangi bir sayıda olabilir ve hepsi aynı ada sahip olacaktı: LastPostedDateTime farklı olan tek şey tarih ve saat.


-1

Bunu dene:

alerts.splice(0,0,{"app":"goodbyeworld","message":"cya"});

Oldukça iyi çalışıyor, dizinin başına ekleyecektir.


Bu bir işe yaramadı çünkü ben sadece bir dizi, bir nesneye splice çağıramazsınız.
Richard Woolf
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.