Declarar matriz de objetos

87

Tengo una variable que es una matriz y quiero que cada elemento de la matriz actúe como un objeto de forma predeterminada. Para lograr esto, puedo hacer algo como esto en mi código.

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

Esto funciona bien, pero no quiero mencionar ningún número de índice. Quiero que todos los elementos de mi matriz sean un objeto. ¿Cómo lo declaro o lo inicializo?

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

Probé el código anterior pero no funciona. ¿Cómo inicializo una matriz de objetos sin usar un número de índice?

Prasath K
fuente
1
Entonces, ¿está tratando de hacer que todos los elementos de la matriz sean objetos, de forma predeterminada?
Jeff Shaver
@Jeff Yupp, tienes razón ..
Prasath K
No veo el sentido de hacerlo. Tal vez entender por qué quiere hacerlo de esta manera nos ayudaría a comprender cómo resolver realmente su problema.
Jeff Shaver
1
¿Qué hay en los objetos? Parece que implementar array.push(objYouWant )dentro de la función definitivamente sería la solución, de esa manera cada vez que se ejecuta la función, agrega un nuevo objeto con las propiedades que desee.
Jeff Shaver
1
No veo cómo el tenerlos automáticamente como objetos ayudaría a su situación.
Jeff Shaver

Respuestas:

90

Úselo array.push()para agregar un elemento al final de la matriz.

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

Para hacer esto n, usa un forbucle.

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

Tenga en cuenta que también puede sustituir new Array()con []y new Object()con {}para que se convierta en:

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

Dependiendo de lo que quiera decir con la declaración , puede intentar usar literales de objeto en una matriz literal :

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

EDITAR: Si su objetivo es una matriz cuyos undefinedelementos son literales de objetos vacíos de forma predeterminada, puede escribir una pequeña función de utilidad:

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

Entonces úsalo así:

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

O incluso:

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

Por supuesto, la asignación directa al valor de retorno de getDefaultObjectAt()no funcionará, por lo que no puede escribir:

getDefaultObjectAt(sample, 2) = { prop: "val" };
Frédéric Hamidi
fuente
@PrasathK, ¿quiere decir que está poblando su matriz dinámicamente (por ejemplo, a través de un bucle)? Entonces debes seguir la respuesta de Daniel y usarla push().
Frédéric Hamidi
@PrasathK, ese voto negativo no es mío. Si te entiendo correctamente, ¿el comentario de Jeff Shaver bajo tu pregunta es correcto?
Frédéric Hamidi
24

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

Creará una matriz de 5 elementos. Entonces puedes usar forEach por ejemplo.

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

Tenga en cuenta que al hacerlo new Array(5), es solo un objeto con una longitud de 5 y la matriz está vacía. Cuando lo usa fill(), llena cada lugar individual con lo que quiera.

Sección de la economía
fuente
Lo vi en la portada justo después de que publicaste. Me llamó la atención porque era una pregunta tan antigua con una nueva respuesta.
melpomene
Creo que esto es difícil de usar y comprender en comparación con otras respuestas.
Sachin Shah
12

Después de ver cómo respondiste en los comentarios. Parece que sería mejor utilizarlo pushcomo han sugerido otros. De esta manera, no necesita conocer los índices, pero aún puede agregar a la matriz.

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

En este caso, cada vez que use esa función, insertará un nuevo objeto en la matriz.

Jeff Shaver
fuente
Oh dios ... tengo más de 100 variables en esos objetos y para todos y cada uno de los objetos o llamadas de la función tengo que inicializar algunos valores para algunas de las variables al comienzo de la función
Prasath K
11

Realmente no es necesario crear Objectnunca s en blanco . No puedes hacer nada con ellos. Simplemente agregue sus objetos de trabajo a la muestra según sea necesario. Use pushcomo sugirió Daniel Imms, y use literales como sugirió Frédéric Hamidi. Parece que desea programar Javascript como 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. */

Creo que el uso new Array(10)crea una matriz con 10 undefinedelementos.

Eric Jablow
fuente
10

Puede crear una instancia de una matriz de "tipo de objeto" en una línea como esta (simplemente reemplace new Object () con su objeto):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
MarzSocks
fuente
2
¿Y si no conozco el valor de los elementos?
Prasath K
6

Bueno array.length, ¿debería hacer el truco o no? algo como, quiero decir que no necesitas saber el rango del índice si lo lees.

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

Tal vez no entendí correctamente su pregunta, pero debería poder obtener la longitud de su matriz de esta manera y transformarla en objetos. Daniel dio la misma respuesta para ser honesto. Puede guardar la longitud de su matriz en su variable y estará listo.

SI y esto no debería suceder, en mi opinión, no puede obtener su longitud de matriz. Como dijiste, sin obtener el número de índice, podrías hacerlo así:

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

Es la versión no agradable de la anterior, pero el bucle se ejecutaría hasta que "salga" del rango del índice.

spitterfly
fuente
5

Prueba esto-

var arr = [];
arr.push({});
ShuklaSannidhya
fuente
Esto hace que solo un elemento sea un objeto. Quiero que todos mis elementos sean un objeto
Prasath K
1
@ShuklaSannidhya A esta publicación le falta una explicación de lo que hace y por qué la recomienda. ...solo digo.
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); 

Este ejemplo funciona conmigo. Instantánea de la salida en la consola del navegador

Abdallah Okasha
fuente
1

Utilice array.push () para agregar un elemento al final de la matriz.

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

puedes usarlo

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

Usando forEach podemos almacenar datos en caso de que ya tengamos datos que queremos hacer un inicio de sesión comercial en los datos.

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

Ejemplo usando un bucle for simple

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

Si desea que todos los elementos dentro de una matriz sean objetos, puede usar JavaScript Proxy para aplicar una validación en los objetos antes de insertarlos en una matriz. Es bastante 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');
    }
  }
});

Ahora, si intentas hacer algo como esto:

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

Lanzará un error. Sin embargo, si inserta un objeto, se le permitirá:

arr[0] = {}; // Allowed

Para obtener más detalles sobre los Proxies, consulte este enlace: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Si está buscando una implementación de polyfill, puede consultar este enlace: https://github.com/GoogleChrome/proxy-polyfill

Sachin Singh
fuente
1

El siguiente código de mi proyecto tal vez sea bueno para ti

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

Cualquiera intente esto ... y sugiera algo.

Cegone
fuente
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Mate
fuente
1
No. Esa es una matriz no vacía de un objeto.
Quentin
¡Bienvenido a Stack Overflow! Si bien este fragmento de código puede resolver la pregunta, incluir una explicación realmente ayuda a mejorar la calidad de su publicación. Recuerde que está respondiendo a la pregunta para los lectores en el futuro, y es posible que esas personas no conozcan los motivos de su sugerencia de código. Por favor, trate también de no llenar su código con comentarios explicativos, ¡esto reduce la legibilidad tanto del código como de las explicaciones!
kayess