Array von Objekten deklarieren

86

Ich habe eine Variable, die ein Array ist, und ich möchte, dass jedes Element des Arrays standardmäßig als Objekt fungiert. Um dies zu erreichen, kann ich so etwas in meinem Code tun.

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

Das funktioniert gut, aber ich möchte keine Indexnummer erwähnen. Ich möchte, dass alle Elemente meines Arrays ein Objekt sind. Wie deklariere oder initialisiere ich es?

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

Ich habe den obigen Code ausprobiert, aber er funktioniert nicht. Wie initialisiere ich ein Array von Objekten ohne Verwendung einer Indexnummer?

Prasath K.
quelle
1
Versuchen Sie also standardmäßig, alle Array-Elemente zu Objekten zu machen?
Jeff Shaver
@ Jeff Yupp, Sie haben Recht ..
Prasath K
Ich sehe keinen Sinn darin. Vielleicht hilft uns das Verständnis, warum Sie dies auf diese Weise tun möchten, zu verstehen, wie Sie Ihr Problem tatsächlich lösen können.
Jeff Shaver
1
Was ist in den Objekten? Es klingt so, als wäre die Implementierung array.push(objYouWant )innerhalb der Funktion definitiv die Lösung. Auf diese Weise wird bei jeder Ausführung der Funktion ein neues Objekt mit den gewünschten Eigenschaften hinzugefügt.
Jeff Shaver
1
Ich sehe nicht ein, wie es Ihrer Situation helfen würde, wenn sie automatisch Objekte sind.
Jeff Shaver

Antworten:

89

Verwenden Sie array.push()diese Option , um ein Element am Ende des Arrays hinzuzufügen.

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

Um dies zu tun nmal eine Verwendung forSchleife.

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

Beachten Sie, dass Sie auch new Array()mit []und new Object()mit ersetzen können, {}so dass es wird:

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

Je nachdem, was Sie unter Deklarieren verstehen , können Sie versuchen, Objektliterale in einem Array-Literal zu verwenden :

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

BEARBEITEN: Wenn Ihr Ziel ein Array ist, dessen undefinedElemente standardmäßig leere Objektliterale sind, können Sie eine kleine Dienstprogrammfunktion schreiben:

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

Dann benutze es so:

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

Oder auch:

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

Natürlich getDefaultObjectAt()funktioniert die direkte Zuordnung zum Rückgabewert von nicht, daher können Sie nicht schreiben:

getDefaultObjectAt(sample, 2) = { prop: "val" };
Frédéric Hamidi
quelle
@PrasathK, meinst du, du füllst dein Array dynamisch (z. B. durch eine Schleife)? Dann solltest du Daniels Antwort folgen und verwenden push().
Frédéric Hamidi
@ PrasathK, diese Ablehnung ist nicht meine. Wenn ich Sie richtig verstehe, ist Jeff Shavers Kommentar unter Ihrer Frage richtig?
Frédéric Hamidi
21

Sie können fill () verwenden .

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

Erstellt ein Array von 5 Elementen. Dann können Sie zum Beispiel forEach verwenden.

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

Beachten Sie, dass new Array(5)es sich dabei nur um ein Objekt mit der Länge 5 handelt und das Array leer ist. Wenn Sie verwenden fill(), füllen Sie jeden einzelnen Punkt mit dem, was Sie wollen.

Ced
quelle
Ich habe es zufällig auf der Titelseite gesehen, gleich nachdem Sie es gepostet haben. Es fiel mir auf, weil es eine so alte Frage mit einer neuen Antwort war.
Melpomene
Ich denke, dies ist im Vergleich zu anderen Antworten schwer zu verwenden und zu verstehen.
Sachin Shah
12

Nachdem Sie gesehen haben, wie Sie in den Kommentaren geantwortet haben. Es scheint, als wäre es am besten, es zu verwenden, pushwie andere vorgeschlagen haben. Auf diese Weise müssen Sie die Indizes nicht kennen, können sie jedoch dem Array hinzufügen.

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

In diesem Fall wird jedes Mal, wenn Sie diese Funktion verwenden, ein neues Objekt in das Array verschoben.

Jeff Shaver
quelle
Oh Gott .. ich habe mehr als 100 Variablen in diesen Objekten und für jedes Objekt oder jeden Aufruf der Funktion muss ich einige Werte für einige der Variablen zu Beginn der Funktion
initialisieren
11

Sie müssen nie wirklich Leerzeichen erstellen Object. Mit ihnen kann man nichts anfangen. Fügen Sie einfach Ihre Arbeitsobjekte nach Bedarf zum Beispiel hinzu. Verwenden Sie, pushwie Daniel Imms vorgeschlagen hat, und verwenden Sie Literale, wie Frédéric Hamidi vorgeschlagen hat. Sie scheinen Javascript wie C programmieren zu wollen.

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. */

Ich glaube, dass die Verwendung new Array(10)ein Array mit 10 undefinedElementen erstellt.

Eric Jablow
quelle
10

Sie können ein Array vom Typ "Objekttyp" in einer Zeile wie folgt instanziieren (ersetzen Sie einfach neues Objekt () durch Ihr Objekt):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
MarzSocks
quelle
2
Was ist, wenn ich den Wert von Elementen nicht kenne?
Prasath K
6

Nun array.lengthsollte der Trick machen oder nicht? Ich meine, Sie müssen den Indexbereich nicht kennen, wenn Sie ihn nur lesen.

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

Vielleicht habe ich Ihre Frage nicht richtig verstanden, aber Sie sollten in der Lage sein, die Länge Ihres Arrays auf diese Weise zu ermitteln und sie in Objekte umzuwandeln. Daniel gab die gleiche Antwort, um ehrlich zu sein. Sie könnten einfach Ihre Array-Länge in seiner Variablen speichern und es wäre erledigt.

WENN und dies sollte meiner Meinung nach nicht passieren, können Sie Ihre Array-Länge nicht erhalten. Wie Sie sagten, ohne die Indexnummer zu erhalten, können Sie dies folgendermaßen tun:

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

Es ist die nicht schöne Version der obigen, aber die Schleife wird ausgeführt, bis Sie den Indexbereich "verlassen".

Spitterfly
quelle
5

Versuche dies-

var arr = [];
arr.push({});
ShuklaSannidhya
quelle
Dies macht nur ein Element zu einem Objekt. Ich möchte, dass alle meine Elemente ein Objekt sind
Prasath K
1
@ShuklaSannidhya In diesem Beitrag fehlt eine Erklärung, was dies bewirkt und warum Sie es empfehlen. ... nur sagen.
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); 

Dieses Beispiel funktioniert bei mir. Schnappschuss für die Ausgabe in der Browserkonsole

Abdallah Okasha
quelle
1

Verwenden Sie array.push (), um ein Element am Ende des Arrays hinzuzufügen.

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

du kannst es benutzen

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

Mit forEach können wir Daten speichern, falls wir bereits Daten haben, für die wir uns geschäftlich anmelden möchten.

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

Beispiel mit der einfachen for-Schleife

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

Wenn alle Elemente in einem Array Objekte sein sollen, können Sie mithilfe von JavaScript-Proxy eine Validierung auf Objekte anwenden, bevor Sie sie in ein Array einfügen. Es ist ganz einfach,

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

Wenn Sie nun versuchen, so etwas zu tun:

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

Es wird ein Fehler ausgegeben. Wenn Sie jedoch ein Objekt einfügen, ist Folgendes zulässig:

arr[0] = {}; // Allowed

Weitere Informationen zu Proxies finden Sie unter folgendem Link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Wenn Sie nach einer Polyfill-Implementierung suchen, können Sie diesen Link überprüfen : https://github.com/GoogleChrome/proxy-polyfill

Sachin Singh
quelle
1

Der folgende Code aus meinem Projekt ist vielleicht gut für Sie

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

Jeder versucht dies .. und schlägt etwas vor.

Cegone
quelle
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Matt
quelle
1
Nein, das ist ein nicht leeres Array eines Objekts.
Quentin
Willkommen bei Stack Overflow! Während dieses Code-Snippet die Frage lösen kann, hilft eine Erklärung wirklich dabei, die Qualität Ihres Beitrags zu verbessern. Denken Sie daran, dass Sie die Frage für Leser in Zukunft beantworten und diese Personen möglicherweise die Gründe für Ihren Codevorschlag nicht kennen. Bitte versuchen Sie auch, Ihren Code nicht mit erklärenden Kommentaren zu überfüllen. Dies verringert die Lesbarkeit sowohl des Codes als auch der Erklärungen!
Kayess