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?


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

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

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

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


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

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!!


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"

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.


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

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


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


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.


-1

Coba ini:

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

Berfungsi cukup baik, itu akan menambahkannya ke awal array.


Ini tidak berhasil karena saya tidak dapat memanggil sambungan pada objek, hanya pada array.
Richard Woolf
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.