Menambah objek

156

Saya memiliki objek yang menyimpan lansiran dan beberapa informasi tentangnya:

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

Selain itu, saya memiliki variabel yang mengatakan berapa banyak peringatan alertNo,. Pertanyaan saya adalah, ketika saya pergi untuk menambahkan lansiran, apakah ada cara untuk menambahkan lansiran ke alertsobjek?

Steve Gattuso
sumber
6
Saya pikir Anda memiliki masalah dengan json Anda yang diposkan: 1: {app: 'helloworld', 'message'} => 1: {app: 'helloworld', pesan: 'a message'}?
Andreas Grech

Jawaban:

235

Bagaimana dengan menyimpan lansiran sebagai rekaman dalam array alih-alih properti satu objek?

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

Dan kemudian untuk menambahkannya, cukup gunakan push:

alerts.push({num : 3, app:'helloagain_again',message:'yet another message'});
Andreas Grech
sumber
1
Jawaban ini mengharapkan Anda untuk mengetahui id tanda yang akan ditambahkan. Nah, jika Anda sudah tahu itu, maka Anda dapat hanya mengikuti format objek asli dan melakukan: alerts[3] = { app: 'hello3', message: 'message 3' }. Dengan ini Anda dapat mengakses pesan dengan id: alerts[2] => { app: 'helloworld', message: 'message' }. Mendapatkan panjangnya berarti: Object.keys(alerts).length(bit itu lebih mudah dengan array)
Matt
61

jQuery $.extend(obj1, obj2)akan menggabungkan 2 objek untuk Anda, tetapi Anda harus benar-benar menggunakan array.

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);
hormatilah Kode
sumber
Jangkauan JQuery lambat: trevmex.com/post/2531629773/jquerys-extend-is-slow . Juga, ada salah ketik. $ .extends () harus membaca $ .extend ().
ken
Tangkapan bagus dengan kesalahan ketik. Ada situasi di mana $ .exend membantu, tetapi Anda benar bahwa itu harus dihindari bila memungkinkan.
respectTheCode
1
Saya pikir memperpanjang () ok ketika Anda hanya memiliki struktur satu catatan, tanpa tanda kurung, untuk sisanya saya setuju dengan hormat. Kode, cukup gunakan push ()
elvenbyte
39

Anda dapat melakukan ini dengan Object.assign () . Kadang-kadang Anda membutuhkan array, tetapi ketika bekerja dengan fungsi yang mengharapkan objek JSON tunggal - seperti panggilan OData - saya menemukan metode ini lebih sederhana daripada membuat array hanya untuk membongkar itu.

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

EDIT: Untuk membahas komentar tentang mendapatkan kunci berikutnya, Anda bisa mendapatkan array kunci dengan fungsi Object.keys () - lihat jawaban Vadi untuk contoh penambahan kunci. Demikian pula, Anda bisa mendapatkan semua nilai dengan Object.values ​​() dan pasangan kunci-nilai dengan Object.entries () .

var alerts = { 
    1: {app:'helloworld',message:'message'},
    2: {app:'helloagain',message:'another message'}
}
console.log(Object.keys(alerts))
// Output
Array [ "1", "2" ]
Thane Plummer
sumber
7
Ini sebenarnya jawaban yang benar karena yang lain merujuk untuk mengubah objek menjadi array, tetapi dengan cara ini Anda menjaganya sebagai objek. Dalam kasus penulis, mungkin lebih baik baginya untuk bekerja dengan array, tetapi ini akan menjadi jawaban tentang cara menambahkan objek.
Goran Jakovljevic
2
ya saya setuju .. dalam pertanyaan tidak ada array objeknya hanya objek jadi ini adalah jawaban yang sempurna!
Kishan Oza
Ini adalah jawaban yang tepat; bagaimana Anda bisa tahu indeks mana yang akan Anda tambahkan objek baru?
Capan
1
ini adalah jawaban untuk pertanyaan judul.
FistOfFury
11

Seperti jawaban lain yang ditunjukkan, Anda mungkin merasa lebih mudah untuk bekerja dengan array.

Jika tidak:

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

Cobalah:

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

MC
sumber
Ini tidak akan berfungsi, jika Anda telah menghapus peringatan atau melewatkan kunci. Anda harus menambahkan sesuatu di sepanjang baris while(alerts[size]) size++;Dan mungkin mengganti nama sizemenjadi newId.
Hingga
11

Anda dapat menggunakan spread syntax sebagai berikut ..

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

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

Sekarang dengan ES6 kami memiliki operator penyebaran yang sangat kuat (... Objek) yang dapat membuat pekerjaan ini sangat mudah. Itu bisa dilakukan sebagai berikut:

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
 }

Itu dia. Ini akan menambahkan kunci yang Anda inginkan. Semoga ini membantu!!

Harshit Agarwal
sumber
6

Anda harus benar-benar pergi dengan array saran peringatan, tetapi jika tidak menambahkan ke objek yang Anda sebutkan akan terlihat seperti ini:

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

Tetapi karena Anda tidak boleh menggunakan angka literal sebagai nama mengutip semuanya dan ikuti

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

atau Anda dapat membuatnya menjadi array objek.

Mengakses sepertinya

alerts['1'].app
=> "helloworld"
dlamblin
sumber
5

Apakah Anda memiliki kemampuan untuk mengubah struktur paling luar menjadi sebuah array? Jadi akan terlihat seperti ini

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

Jadi ketika Anda perlu menambahkan satu, Anda bisa mendorongnya ke array

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

Kemudian Anda memiliki indeks berbasis nol bawaan untuk cara penghitungan kesalahan.

Peter Bailey
sumber
2

Lebih mudah dengan ES6:

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}
}
Maroun Melhem
sumber
0

Sebagai alternatif, dalam ES6, sintaksis penyebaran dapat digunakan. ${Object.keys(alerts).length + 1}kembali berikutnya iduntuk lansiran.

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

Vadi
sumber
0

Maaf, saya tidak dapat mengomentari jawaban Anda karena reputasi saya! ... jadi, jika Anda ingin mengubah struktur objek Anda , Anda harus melakukan seperti yang dikatakan Thane Plummer, tetapi sedikit trik jika Anda tidak peduli di mana untuk meletakkan item: itu akan dimasukkan pada posisi pertama jika Anda tidak menentukan nomor untuk penyisipan.

Ini luar biasa jika Anda ingin melewatkan objek Json misalnya ke panggilan fungsi mongoDB dan memasukkan kunci baru di dalam kondisi yang Anda terima. Dalam hal ini saya akan memasukkan item myUid dengan beberapa info dari variabel di dalam kode saya:

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

Marc
sumber
0

[Javascript] Setelah sedikit jiggery pokery, ini berhasil bagi saya:

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

Masalah yang saya perlu selesaikan adalah bahwa saya mungkin memiliki sejumlah acara dan mereka semua akan memiliki nama yang sama: LastPostedDateTime semua yang berbeda adalah tanggal dan waktu.

David White
sumber
-1

Coba ini:

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

Berfungsi cukup baik, itu akan menambahkannya ke awal array.

HM2K
sumber
Ini tidak berhasil karena saya tidak dapat memanggil sambungan pada objek, hanya pada array.
Richard Woolf