web-dev-qa-db-fra.com

Déclarer un tableau d'objets

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 ce faire, 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 des objets. Comment puis-je 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 un numéro d'index?

70
Prasath K

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

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

Pour ce faire, utilisez n fois une boucle for.

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({});
78
Daniel Imms

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

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

EDIT: Si votre objectif est un tableau dont les éléments undefined sont des littéraux d'objet 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" };
31

Après avoir vu comment vous avez répondu dans les commentaires. Il semble qu'il serait préférable d'utiliser Push comme d'autres l'ont suggéré. De cette façon, vous n'avez pas besoin de connaître les index, mais vous pouvez toujours ajouter des éléments 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, un nouvel objet sera inséré dans le tableau.

11
Jeff Shaver

Vous n'avez pas vraiment besoin de créer une Object vide. Vous ne pouvez rien faire avec eux. Ajoutez simplement vos objets de travail à l'échantillon selon vos besoins. Utilisez Push comme suggéré par Daniel Imms et utilisez des lettres comme suggéré par 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 de new Array(10) crée un tableau avec 10 undefined éléments.

10
Eric Jablow

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

Vous pouvez utiliser fill () puis map . C'est explicite.

let arr = new Array(5).fill(null).map(v => new String('lol'));

Va créer un tableau de 5 objets de chaîne (pas de chaîne!). Ensuite, vous pouvez utiliser forEach par exemple.

arr.forEach(d => console.log(d.toString()));

La réponse à cette question est à mon avis inutilement prolixe. J'espère donc que cela sera utile à certains d'entre vous.

5
Ced

Bien array.length devrait 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 le 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 donné la même réponse pour être honnête. Vous pouvez simplement sauvegarder votre tableau dans sa variable et ce sera fait.

Si cela ne devrait pas arriver à mon avis, vous ne pouvez pas obtenir votre longueur de 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-Nice de celle ci-dessus mais la boucle s'exécute jusqu'à ce que vous "couriez" hors de la plage d'index.

5
spitterfly

Essaye ça-

var arr = [];
arr.Push({});
3
ShuklaSannidhya
//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

3
Abdallah Okasha

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

   var newList: any = [];

        this.state.chargeDetailList.forEach((item: any) => {
            if (newList == null ) {
                var obj = {
                    chargeClassification: item.Classfication,
                    totalChargeAmount: item.ChargeAmount
                };
                newList.Push(obj);

            } else {
                newList.Find((x: any) => x.chargeClassification == item.Classfication)
                    .totalChargeAmount += item.ChargeAmount;
            }

        });

        if (newList.any() || newList.length) {
            newList.Push({
                chargeClassification: 'Total',
                totalChargeAmount: newList.sum((x: any) => x.totalChargeAmount)
            })
        }
0
Metin Atalay

En utilisant forEach, nous pouvons stocker des données si nous avons déjà des données pour lesquelles nous souhaitons établir une connexion d’entreprise. 

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 simple for for 

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

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())
}    
0
ashishdudhat

Si vous souhaitez que tous les éléments d'un tableau soient des objets, vous pouvez utiliser le proxy JavaScript pour appliquer une validation aux 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

Il va jeter une erreur. Cependant, si vous insérez un objet, il sera autorisé:

arr[0] = {}; // Allowed

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

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

0
Sachin Singh