Mendeklarasikan larik objek

87

Saya memiliki variabel yang merupakan sebuah array dan saya ingin setiap elemen dari array tersebut bertindak sebagai objek secara default. Untuk mencapai ini, saya dapat melakukan sesuatu seperti ini di kode saya.

var sample = new Array();
sample[0] = new Object();
sample[1] = new Object();

Ini berfungsi dengan baik, tetapi saya tidak ingin menyebutkan nomor indeks apa pun. Saya ingin semua elemen array saya menjadi objek. Bagaimana cara mendeklarasikan atau menginisialisasinya?

var sample = new Array();
sample[] = new Object();

Saya mencoba kode di atas tetapi tidak berhasil. Bagaimana cara menginisialisasi larik objek tanpa menggunakan nomor indeks?

Prasath K
sumber
1
Jadi, apakah Anda mencoba membuat semua objek item array, secara default?
Jeff Shaver
@Jeff Yupp, kamu benar ..
Prasath K
Saya tidak melihat gunanya melakukan itu. Mungkin memahami mengapa Anda ingin melakukannya dengan cara ini akan membantu kami memahami bagaimana sebenarnya menyelesaikan masalah Anda.
Jeff Shaver
1
Apa yang ada di objek? Sepertinya menerapkan array.push(objYouWant )di dalam fungsi pasti akan menjadi solusinya. Dengan begitu, setiap kali fungsi dijalankan, ia menambahkan objek baru dengan properti apa pun yang Anda inginkan.
Jeff Shaver
1
Saya tidak melihat bagaimana membuatnya secara otomatis menjadi objek akan membantu situasi Anda.
Jeff Shaver

Jawaban:

90

Gunakan array.push()untuk menambahkan item ke akhir larik.

var sample = new Array();
sample.push(new Object());

Untuk melakukan nkali ini gunakan forloop.

var n = 100;
var sample = new Array();
for (var i = 0; i < n; i++)
    sample.push(new Object());

Perhatikan bahwa Anda juga dapat mengganti new Array()dengan []dan new Object()dengan {}sehingga menjadi:

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});
Daniel Imms
sumber
38

Bergantung pada apa yang Anda maksud dengan mendeklarasikan , Anda dapat mencoba menggunakan literal objek dalam literal array :

var sample = [{}, {}, {} /*, ... */];

EDIT: Jika tujuan Anda adalah larik yang undefineditemnya adalah literal objek kosong secara default, Anda dapat menulis fungsi utilitas kecil:

function getDefaultObjectAt(array, index)
{
    return array[index] = array[index] || {};
}

Kemudian gunakan seperti ini:

var sample = [];
var obj = getDefaultObjectAt(sample, 0);     // {} returned and stored at index 0.

Atau bahkan:

getDefaultObjectAt(sample, 1).prop = "val";  // { prop: "val" } stored at index 1.

Tentu saja, penetapan langsung ke nilai kembalian getDefaultObjectAt()tidak akan berfungsi, jadi Anda tidak dapat menulis:

getDefaultObjectAt(sample, 2) = { prop: "val" };
Frédéric Hamidi
sumber
@PrasathK, maksud Anda mengisi array Anda secara dinamis (misalnya melalui loop)? Maka Anda harus mengikuti jawaban dan penggunaan Daniel push().
Frédéric Hamidi
@PrasathK, suara negatif itu bukan milik saya. Jika saya memahami Anda dengan benar, komentar Jeff Shaver di bawah pertanyaan Anda benar?
Frédéric Hamidi
26

Anda dapat menggunakan fill () .

let arr = new Array(5).fill('lol');

let arr2 = new Array(5).fill({ test: 'a' });
// or if you want different objects
let arr3 = new Array(5).fill().map((_, i) => ({ id: i }));

Akan membuat array 5 item. Kemudian Anda dapat menggunakan forEach sebagai contoh.

arr.forEach(str => console.log(str));

Perhatikan bahwa saat melakukan new Array(5)itu hanya sebuah objek dengan panjang 5 dan arraynya kosong. Saat Anda menggunakannya, fill()Anda mengisi setiap tempat dengan apa pun yang Anda inginkan.

Ced
sumber
Saya kebetulan melihatnya di halaman depan tepat setelah Anda memposting. Itu menarik perhatian saya karena itu adalah pertanyaan lama dengan jawaban baru.
melpomene
Saya pikir ini sulit untuk digunakan dan dipahami dibandingkan dengan jawaban lain.
Sachin Shah
12

Setelah melihat bagaimana Anda menanggapi di komentar. Sepertinya akan lebih baik jika digunakan pushseperti yang disarankan orang lain. Dengan cara ini Anda tidak perlu mengetahui indeksnya, tetapi Anda masih bisa menambahkan ke array.

var arr = [];
function funcInJsFile() {
    // Do Stuff
    var obj = {x: 54, y: 10};
    arr.push(obj);
}

Dalam hal ini, setiap kali Anda menggunakan fungsi itu, itu akan mendorong objek baru ke dalam larik.

Jeff Shaver
sumber
Ya Tuhan .. saya memiliki lebih dari 100 variabel dalam objek tersebut dan untuk setiap objek atau pemanggilan fungsi saya harus menginisialisasi beberapa nilai untuk beberapa variabel pada awal fungsi
Prasath K
11

Anda tidak perlu Objectpernah membuat kosong . Anda tidak dapat melakukan apapun dengan mereka. Cukup tambahkan objek kerja Anda ke sampel sesuai kebutuhan. Gunakan pushseperti yang disarankan Daniel Imms, dan gunakan literal seperti yang disarankan Frédéric Hamidi. Anda sepertinya ingin memprogram Javascript seperti C.

var samples = []; /* If you have no data to put in yet. */
/* Later, probably in a callback method with computed data */
/* replacing the constants. */
samples.push(new Sample(1, 2, 3)); /* Assuming Sample is an object. */
/* or */
samples.push({id: 23, chemical: "NO2", ppm: 1.4}); /* Object literal. */

Saya percaya menggunakan new Array(10)membuat array dengan 10 undefinedelemen.

Eric Jablow
sumber
10

Anda dapat membuat instance larik "tipe objek" dalam satu baris seperti ini (cukup ganti Object () baru dengan objek Anda):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
MarzSocks
sumber
2
Bagaimana jika saya tidak mengetahui nilai elemen?
Prasath K
6

Nah array.lengthharus melakukan trik atau tidak? sesuatu seperti, maksud saya Anda tidak perlu mengetahui kisaran indeks jika Anda hanya membacanya ..

var arrayContainingObjects = [];
for (var i = 0; i < arrayContainingYourItems.length; i++){
    arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
}

Mungkin saya tidak memahami Pertanyaan Anda dengan benar, tetapi Anda harus bisa mendapatkan panjang Array Anda dengan cara ini dan mengubahnya menjadi objek. Sejujurnya Daniel memberikan jawaban yang sama. Anda bisa menyimpan panjang array Anda ke variabelnya dan itu akan selesai.

JIKA dan ini seharusnya tidak terjadi menurut saya, Anda tidak bisa mendapatkan panjang Array Anda. Seperti yang Anda katakan tanpa mendapatkan nomor indeks, Anda dapat melakukannya seperti ini:

var arrayContainingObjects = [];
for (;;){
    try{
        arrayContainingObjects.push {(property: arrayContainingYourItems[i])};
    }
}
catch(err){
    break;
}

Ini adalah versi yang tidak bagus dari yang di atas tetapi loop akan dieksekusi sampai Anda "kehabisan" rentang indeks.

spitterfly
sumber
5

Coba ini-

var arr = [];
arr.push({});
ShuklaSannidhya
sumber
Ini membuat hanya satu elemen menjadi objek .. Saya ingin semua elemen saya menjadi objek
Prasath K
1
@ShuklaSannidhya Posting ini kurang penjelasan tentang apa yang dilakukannya dan mengapa Anda merekomendasikannya. ... hanya mengatakan.
mickmackusa
5
//making array of book object
var books = [];
    var new_book = {id: "book1", name: "twilight", category: "Movies", price: 10};
    books.push(new_book);
    new_book = {id: "book2", name: "The_call", category: "Movies", price: 17};
    books.push(new_book);
    console.log(books[0].id);
    console.log(books[0].name);
    console.log(books[0].category);
    console.log(books[0].price);

// also we have array of albums
var albums = []    
    var new_album = {id: "album1", name: "Ahla w Ahla", category: "Music", price: 15};
    albums.push(new_album);
    new_album = {id: "album2", name: "El-leila", category: "Music", price: 29};
    albums.push(new_album);
//Now, content [0] contains all books & content[1] contains all albums
var content = [];
content.push(books);
content.push(albums);
var my_books = content[0];
var my_albums = content[1];
console.log(my_books[0].name);
console.log(my_books[1].name); 

console.log(my_albums[0].name);
console.log(my_albums[1].name); 

Contoh Ini Bekerja dengan Saya. Snapshot untuk Output di Konsol Browser

Abdallah Okasha
sumber
1

Gunakan array.push () untuk menambahkan item ke akhir array.

var sample = new Array();
sample.push(new Object());

kamu bisa menggunakannya

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.push({}) 
  OR
  sample.push(new Object())
}    
ashishdudhat
sumber
1

Dengan menggunakan forEach kita dapat menyimpan data jika kita sudah memiliki data, kita ingin melakukan login bisnis pada data.

var sample = new Array();
var x = 10;
var sample = [1,2,3,4,5,6,7,8,9];
var data = [];

sample.forEach(function(item){
    data.push(item);
})

document.write(data);

Contoh dengan menggunakan simple for loop

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.push(i);
}
document.write(data);
Sachin Shah
sumber
1

Jika Anda ingin semua elemen di dalam array menjadi objek, Anda dapat menggunakan JavaScript Proxy untuk menerapkan validasi pada objek sebelum Anda memasukkannya ke dalam array. Ini cukup sederhana,

const arr = new Proxy(new Array(), {
  set(target, key, value) {
    if ((value !== null && typeof value === 'object') || key === 'length') {
      return Reflect.set(...arguments);
    } else {
      throw new Error('Only objects are allowed');
    }
  }
});

Sekarang jika Anda mencoba melakukan sesuatu seperti ini:

arr[0] = 'Hello World'; // Error

Ini akan menimbulkan kesalahan. Namun jika Anda memasukkan sebuah objek, itu akan diizinkan:

arr[0] = {}; // Allowed

Untuk detail lebih lanjut tentang Proxies, silakan merujuk ke tautan ini: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Jika Anda mencari implementasi polyfill, Anda dapat melihat tautan ini: https://github.com/GoogleChrome/proxy-polyfill

Sachin Singh
sumber
1

Kode di bawah ini dari proyek saya mungkin baik untuk Anda

  reCalculateDetailSummary(updateMode: boolean) {

    var summaryList: any = [];
    var list: any;
    if (updateMode) { list = this.state.pageParams.data.chargeDefinitionList }
    else {
        list = this.state.chargeDefinitionList;
    }

    list.forEach((item: any) => {
        if (summaryList == null || summaryList.length == 0) {
            var obj = {
                chargeClassification: item.classfication,
                totalChargeAmount: item.chargeAmount
            };
            summaryList.push(obj);

        } else {
            if (summaryList.find((x: any) => x.chargeClassification == item.classfication)) {
                summaryList.find((x: any) => x.chargeClassification == item.classfication)
                    .totalChargeAmount += item.chargeAmount;
            }
        }
    });

    if (summaryList != null && summaryList.length != 0) {
        summaryList.push({
            chargeClassification: 'Total',
            totalChargeAmount: summaryList.reduce((a: any, b: any) => a + b).totalChargeAmount
        })
    }

    this.setState({ detailSummaryList: summaryList });
}
Metin Atalay
sumber
1
const sample = [];
    list.forEach(element => {
      const item = {} as { name: string, description: string };
      item.name= element.name;
      item.description= element.description;
      sample.push(item);
    });
    return sample;

Siapapun mencoba ini .. dan menyarankan sesuatu.

Selamat
sumber
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Matt
sumber
1
Tidak. Itu adalah array yang tidak kosong dari satu objek.
Quentin
Selamat datang di Stack Overflow! Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Harap juga mencoba untuk tidak membanjiri kode Anda dengan komentar penjelasan, ini mengurangi keterbacaan kode dan penjelasannya!
kayess