Déclaration d'un tableau d'objets

87

J'ai une variable qui est un tableau et je veux que chaque élément du tableau agisse comme un objet par défaut. Pour y parvenir, je peux faire quelque chose comme ça dans mon code.

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

Cela fonctionne bien, mais je ne veux mentionner aucun numéro d'index. Je veux que tous les éléments de mon tableau soient un objet. Comment le déclarer ou l'initialiser?

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

J'ai essayé le code ci-dessus mais cela ne fonctionne pas. Comment initialiser un tableau d'objets sans utiliser de numéro d'index?

Prasath K
la source
1
Alors essayez-vous de créer tous les objets des éléments de tableau, par défaut?
Jeff Shaver
@Jeff Yupp, vous avez raison ..
Prasath K
Je ne vois pas l'utilité de le faire. Peut-être que comprendre pourquoi vous voulez le faire de cette façon nous aiderait à comprendre comment résoudre réellement votre problème.
Jeff Shaver
1
Qu'y a-t-il dans les objets? Il semble que l'implémentation array.push(objYouWant )à l'intérieur de la fonction serait certainement la solution. De cette façon, chaque fois que la fonction est exécutée, elle ajoute un nouvel objet avec les propriétés que vous voulez.
Jeff Shaver
1
Je ne vois pas comment les avoir automatiquement comme des objets aiderait votre situation.
Jeff Shaver

Réponses:

90

Utilisez array.push()pour ajouter un élément à la fin du tableau.

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

Pour ce faire n, utilisez une forboucle.

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

Notez que vous pouvez également remplacer new Array()par []et new Object()par {}pour qu'il devienne:

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

Selon ce que vous entendez par déclaration , vous pouvez essayer d'utiliser des littéraux d'objet dans un littéral de tableau :

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

EDIT: Si votre objectif est un tableau dont les undefinedéléments sont des littéraux d'objets vides par défaut, vous pouvez écrire une petite fonction utilitaire:

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

Ensuite, utilisez-le comme ceci:

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

Ou même:

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

Bien sûr, l'affectation directe à la valeur de retour de getDefaultObjectAt()ne fonctionnera pas, vous ne pouvez donc pas écrire:

getDefaultObjectAt(sample, 2) = { prop: "val" };
Frédéric Hamidi
la source
@PrasathK, voulez-vous dire que vous remplissez votre tableau de manière dynamique (par exemple via une boucle)? Ensuite, vous devriez suivre la réponse et l'utilisation de Daniel push().
Frédéric Hamidi
@PrasathK, ce vote négatif n'est pas le mien. Si je vous comprends bien, le commentaire de Jeff Shaver sous votre question est-il exact?
Frédéric Hamidi
23

Vous pouvez utiliser 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 }));

Créera un tableau de 5 éléments. Ensuite, vous pouvez utiliser forEach par exemple.

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

Notez que lorsque vous faites, new Array(5)c'est juste un objet de longueur 5 et le tableau est vide. Lorsque vous utilisez, fill()vous remplissez chaque emplacement individuel avec ce que vous voulez.

Ced
la source
Je l'ai vu sur la première page juste après votre publication. Cela a attiré mon attention parce que c'était une question si ancienne avec une nouvelle réponse.
melpomene
Je pense que c'est difficile à utiliser et à comprendre par rapport à d'autres réponses.
Sachin Shah
12

Après avoir vu comment vous avez répondu dans les commentaires. Il semble qu'il serait préférable de l'utiliser pushcomme d'autres l'ont suggéré. De cette façon, vous n'avez pas besoin de connaître les indices, mais vous pouvez toujours ajouter au tableau.

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

Dans ce cas, chaque fois que vous utilisez cette fonction, elle poussera un nouvel objet dans le tableau.

Jeff Shaver
la source
Oh mon dieu .. j'ai plus de 100 variables dans ces objets et pour chaque objet ou appel de la fonction, je dois initialiser certaines valeurs pour certaines des variables au début de la fonction
Prasath K
11

Vous n'avez jamais vraiment besoin de créer des blancs Object. Vous ne pouvez rien faire avec eux. Ajoutez simplement vos objets de travail à l'échantillon si nécessaire. Utilisez pushcomme le suggère Daniel Imms et utilisez des littéraux comme le suggère Frédéric Hamidi. Vous semblez vouloir programmer Javascript comme 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. */

Je crois que l'utilisation new Array(10)crée un tableau avec 10 undefinedéléments.

Eric Jablow
la source
10

Vous pouvez instancier un tableau de "type d'objet" sur une ligne comme ceci (remplacez simplement new Object () par votre objet):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
MarzChaussettes
la source
2
Et si je ne connais pas la valeur des éléments?
Prasath K
6

Eh bien, array.lengthdevrait faire l'affaire ou pas? quelque chose comme, je veux dire que vous n'avez pas besoin de connaître la plage d'index si vous venez de la lire

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

Peut-être que je n'ai pas bien compris votre question, mais vous devriez pouvoir obtenir la longueur de votre tableau de cette façon et les transformer en objets. Daniel a en quelque sorte donné la même réponse pour être honnête. Vous pouvez simplement enregistrer la longueur de votre tableau dans sa variable et ce serait fait.

SI et cela ne devrait pas arriver à mon avis, vous ne pouvez pas obtenir la longueur de votre tableau. Comme vous l'avez dit sans obtenir le numéro d'index, vous pouvez le faire comme ceci:

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

C'est la version pas sympa de celle ci-dessus mais la boucle s'exécuterait jusqu'à ce que vous "couriez" hors de la plage d'index.

Spitterfly
la source
5

Essaye ça-

var arr = [];
arr.push({});
ShuklaSannidhya
la source
Cela fait qu'un seul élément est un objet .. Je veux que tous mes éléments soient un objet
Prasath K
1
@ShuklaSannidhya Ce message manque d'explication sur ce que cela fait et pourquoi vous le recommandez. ... juste en disant.
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); 

Cet exemple fonctionne avec moi. Instantané de la sortie sur la console du navigateur

Abdallah Okasha
la source
1

Utilisez array.push () pour ajouter un élément à la fin du tableau.

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

tu peux l'utiliser

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

En utilisant forEach, nous pouvons stocker des données au cas où nous aurions déjà des données, nous voulons faire une connexion professionnelle sur les données.

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

Exemple en utilisant une boucle for simple

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

Si vous souhaitez que tous les éléments d'un tableau soient des objets, vous pouvez utiliser le proxy JavaScript pour appliquer une validation sur les objets avant de les insérer dans un tableau. C'est assez simple,

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

Maintenant, si vous essayez de faire quelque chose comme ça:

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

Cela lancera une erreur. Cependant si vous insérez un objet, il sera autorisé:

arr[0] = {}; // Allowed

Pour plus de détails sur les proxies, veuillez consulter ce lien: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Si vous recherchez une implémentation polyfill, vous pouvez consulter ce lien: https://github.com/GoogleChrome/proxy-polyfill

Sachin Singh
la source
1

Le code ci-dessous de mon projet est peut-être bon pour vous

  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
la source
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;

Tout le monde essaie ceci ... et suggère quelque chose.

Cegone
la source
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Mat
la source
1
Non. C'est un tableau non vide d' un objet.
Quentin
Bienvenue dans Stack Overflow! Bien que cet extrait de code puisse résoudre la question, inclure une explication aide vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code. Essayez également de ne pas surcharger votre code avec des commentaires explicatifs, cela réduit la lisibilité du code et des explications!
kayess