Dichiarazione di array di oggetti


87

Ho una variabile che è un array e voglio che ogni elemento dell'array agisca come un oggetto per impostazione predefinita. Per ottenere ciò, posso fare qualcosa di simile nel mio codice.

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

Funziona bene, ma non voglio menzionare alcun numero di indice. Voglio che tutti gli elementi del mio array siano un oggetto. Come lo dichiaro o lo inizializzo?

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

Ho provato il codice sopra ma non funziona. Come si inizializza un array di oggetti senza utilizzare un numero di indice?


1
Quindi stai cercando di rendere tutti gli elementi dell'array oggetti, per impostazione predefinita?
Jeff Shaver

@ Jeff Yupp, hai ragione ..
Prasath K

Non vedo il motivo di farlo. Forse capire perché vuoi farlo in questo modo ci aiuterebbe a capire come risolvere effettivamente il tuo problema.
Jeff Shaver

1
Cosa c'è negli oggetti? Sembra che l'implementazione array.push(objYouWant )all'interno della funzione sarebbe sicuramente la soluzione. In questo modo, ogni volta che la funzione viene eseguita, aggiunge un nuovo oggetto con le proprietà desiderate.
Jeff Shaver

1
Non vedo come averli automaticamente come oggetti possa aiutare la tua situazione.
Jeff Shaver

Risposte:


90

Utilizzare array.push()per aggiungere un elemento alla fine della matrice.

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

Per fare questo nvolte usa un forciclo.

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

Nota che puoi anche sostituire new Array()con []e new Object()con {}così diventa:

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

38

A seconda di cosa intendi dichiarare , puoi provare a utilizzare letterali oggetto in un letterale array :

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

MODIFICA: se il tuo obiettivo è un array i cui undefinedelementi sono letterali oggetto vuoti per impostazione predefinita, puoi scrivere una piccola funzione di utilità:

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

Quindi usalo in questo modo:

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

O anche:

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

Ovviamente, l'assegnazione diretta al valore restituito di getDefaultObjectAt()non funzionerà, quindi non puoi scrivere:

getDefaultObjectAt(sample, 2) = { prop: "val" };

@ PrasathK, vuoi dire che stai popolando il tuo array dinamicamente (ad esempio attraverso un ciclo)? Quindi dovresti seguire la risposta di Daniel e usare push().
Frédéric Hamidi

@PrasathK, quel voto negativo non è mio. Se ti ho capito bene, il commento di Jeff Shaver sotto la tua domanda è giusto?
Frédéric Hamidi

26

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

Creerà un array di 5 elementi. Quindi puoi usare forEach per esempio.

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

Nota che quando lo fai new Array(5)è solo un oggetto con lunghezza 5 e l'array è vuoto. Quando lo usi fill()riempi ogni singolo punto con quello che vuoi.


Mi è capitato di vederlo in prima pagina subito dopo averlo postato. Ha attirato la mia attenzione perché era una vecchia domanda con una nuova risposta.
melpomene

Penso che questo sia difficile da usare e da capire rispetto ad altre risposte.
Sachin Shah

12

Dopo aver visto come hai risposto nei commenti. Sembra che sarebbe meglio usare pushcome altri hanno suggerito. In questo modo non è necessario conoscere gli indici, ma è comunque possibile aggiungerli all'array.

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

In questo caso, ogni volta che usi quella funzione, inserirà un nuovo oggetto nell'array.


Oddio ... ho più di 100 variabili in quegli oggetti e per ogni oggetto o chiamata della funzione devo inizializzare alcuni valori per alcune delle variabili all'inizio della funzione
Prasath K

11

Non hai davvero bisogno di creare spazi vuoti Object mai. Non puoi fare niente con loro. Basta aggiungere i tuoi oggetti di lavoro al campione secondo necessità. Usa pushcome suggerito da Daniel Imms e usa letterali come suggerito da Frédéric Hamidi. Sembra che tu voglia programmare Javascript come 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. */

Credo che l'utilizzo new Array(10)crei un array con 10 undefinedelementi.


10

Puoi istanziare un array di "tipo di oggetto" in una riga come questa (sostituisci semplicemente new Object () con il tuo oggetto):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });

2
E se non conosco il valore degli elementi?
Prasath K

6

Bene array.lengthdovrebbe fare il trucco o no? qualcosa del tipo, voglio dire che non hai bisogno di conoscere l'intervallo dell'indice se lo leggi solo ..

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

Forse non ho capito correttamente la tua domanda, ma dovresti essere in grado di ottenere la lunghezza del tuo array in questo modo e trasformarlo in oggetti. Daniel ha dato la stessa risposta ad essere onesti. Potresti semplicemente salvare la lunghezza dell'array nella sua variabile e sarebbe fatto.

SE e questo non dovrebbe accadere secondo me non puoi ottenere la tua lunghezza di array. Come hai detto senza ottenere il numero di indice potresti farlo in questo modo:

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

È la versione non carina di quella sopra, ma il ciclo verrà eseguito fino a quando non si "esaurisce" l'intervallo di indice.


5

Prova questo-

var arr = [];
arr.push({});

Questo rende solo un elemento un oggetto .. Voglio che tutti i miei elementi siano un oggetto
Prasath K

1
@ShuklaSannidhya In questo post manca la spiegazione di cosa fa e perché lo consigli. ... sto solo dicendo.
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); 

Questo esempio funziona con me. Snapshot per l'output sulla console del browser


1

Usa array.push () per aggiungere un elemento alla fine dell'array.

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

Puoi usarlo

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

1

Usando forEach possiamo memorizzare i dati nel caso in cui abbiamo già dati che vogliamo fare un po 'di login aziendale sui dati.

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

Esempio utilizzando il semplice ciclo for

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

1

Se si desidera che tutti gli elementi all'interno di un array siano oggetti, è possibile utilizzare JavaScript Proxy per applicare una convalida agli oggetti prima di inserirli in un array. È abbastanza semplice

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

Ora se provi a fare qualcosa del genere:

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

Genererà un errore. Tuttavia se inserisci un oggetto, sarà consentito:

arr[0] = {}; // Allowed

Per maggiori dettagli sui proxy fare riferimento a questo collegamento: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Se stai cercando un'implementazione polyfill puoi controllare questo link: https://github.com/GoogleChrome/proxy-polyfill


1

Il codice seguente dal mio progetto forse ti fa bene

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

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;

Qualcuno prova questo .. e suggerisce qualcosa.


-7
var ArrayofObjects = [{}]; //An empty array of objects.

1
No. Questo è un array non vuoto di un oggetto.
Quentin

Benvenuto in Stack Overflow! Sebbene questo snippet di codice possa risolvere la domanda, includere una spiegazione aiuta davvero a migliorare la qualità del tuo post. Ricorda che stai rispondendo alla domanda per i lettori in futuro e quelle persone potrebbero non conoscere i motivi del tuo suggerimento sul codice. Cerca anche di non affollare il tuo codice con commenti esplicativi, questo riduce la leggibilità sia del codice che delle spiegazioni!
kayess
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.