Declaração de matriz de objetos


87

Eu tenho uma variável que é uma matriz e quero que cada elemento da matriz atue como um objeto por padrão. Para conseguir isso, posso fazer algo assim no meu código.

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

Isso funciona bem, mas não quero mencionar nenhum número de índice. Eu quero que todos os elementos do meu array sejam um objeto. Como declaro ou inicializo?

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

Tentei o código acima, mas não funciona. Como inicializo uma matriz de objetos sem usar um número de índice?


1
Então você está tentando fazer todos os objetos de itens do array, por padrão?
Jeff Shaver de

@Jeff Yupp, você está certo ..
Prasath K

Não vejo sentido em fazer isso. Talvez entender por que você deseja fazer isso nos ajude a entender como realmente resolver o seu problema.
Jeff Shaver de

1
O que há nos objetos? Parece que implementar array.push(objYouWant )dentro da função seria definitivamente a solução. Dessa forma, cada vez que a função é executada, ela adiciona um novo objeto com as propriedades que você deseja.
Jeff Shaver de

1
Não vejo como tê-los como objetos automaticamente ajudaria em sua situação.
Jeff Shaver de

Respostas:


90

Use array.push()para adicionar um item ao final da matriz.

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

Para fazer isso n, use um forloop.

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

Observe que você também pode substituir new Array()por []e new Object()por {}isso se torna:

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

38

Dependendo do que você entende por declarar , você pode tentar usar literais de objeto em um literal de matriz :

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

EDITAR: Se sua meta é uma matriz cujos undefineditens são literais de objetos vazios por padrão, você pode escrever uma pequena função de utilidade:

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

Em seguida, use-o assim:

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

Ou ainda:

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

Claro, a atribuição direta ao valor de retorno de getDefaultObjectAt()não funcionará, então você não pode escrever:

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

@PrasathK, você quer dizer que está preenchendo seu array dinamicamente (por exemplo, por meio de um loop)? Então você deve seguir a resposta de Daniel e usar push().
Frédéric Hamidi

@PrasathK, esse downvote não é meu. Se bem entendi, o comentário de Jeff Shaver sob sua pergunta está certo?
Frédéric Hamidi

24

Você pode 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 }));

Irá criar uma matriz de 5 itens. Então você pode usar forEach, por exemplo.

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

Observe que, ao fazer new Array(5)isso, é apenas um objeto com comprimento 5 e o array está vazio. Quando você usa, fill()você preenche cada local individual com o que quiser.


Acontece que eu vi na primeira página logo depois que você postou. Isso chamou minha atenção porque era uma pergunta muito antiga com uma nova resposta.
melpomene

Eu acho que isso é difícil de usar e entender em comparação com outras respostas.
Sachin Shah

12

Depois de ver como você respondeu nos comentários. Parece que seria melhor usar pushcomo outros sugeriram. Dessa forma, você não precisa saber os índices, mas ainda pode adicioná-los ao array.

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

Nesse caso, toda vez que você usar essa função, ela enviará um novo objeto para o array.


Oh Deus .. eu tenho mais de 100 variáveis ​​nesses objetos e para cada objeto ou chamada da função eu tenho que inicializar alguns valores para algumas das variáveis ​​no início da função
Prasath K

11

Você realmente não precisa criar Objects em branco nunca. Você não pode fazer nada com eles. Basta adicionar seus objetos de trabalho à amostra conforme necessário. Use pushcomo Daniel Imms sugeriu e use literais como sugeriu Frédéric Hamidi. Você parece querer 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. */

Acredito que o uso de new Array(10)cria um array com 10 undefinedelementos.


10

Você pode instanciar uma matriz de "tipo de objeto" em uma linha como esta (apenas substitua new Object () pelo seu objeto):

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

2
E se eu não souber o valor dos elementos?
Prasath K de

6

Bem, array.lengthdeve fazer o truque ou não? algo como, quero dizer, você não precisa saber o intervalo do índice se apenas lê-lo ..

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

Talvez eu não tenha entendido sua pergunta corretamente, mas você deve ser capaz de obter o comprimento de seu Array dessa forma e transformá-los em objetos. Daniel meio que deu a mesma resposta para ser honesto. Você poderia simplesmente salvar o comprimento do seu array na variável dele e pronto.

SE e isso não deveria acontecer na minha opinião, você não pode obter o comprimento do seu Array. Como você disse, sem obter o número do índice, você poderia fazer assim:

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

É a versão não legal da anterior, mas o loop seria executado até que você "executasse" fora do intervalo do índice.


5

Tente isto-

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

Isso faz com que apenas um elemento seja um objeto. Eu quero que todos os meus elementos sejam um objeto
Prasath K

1
@ShuklaSannidhya Falta explicação sobre o que isso faz e por que você o recomenda. ...apenas dizendo.
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 exemplo funciona comigo. Instantâneo para a saída no console do navegador


1

Use array.push () para adicionar um item ao final do array.

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

você pode usar isso

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

1

Usando forEach podemos armazenar dados caso já tenhamos dados que desejamos fazer algum login de negócios nos dados.

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

Exemplo usando loop for simples

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

1

Se você deseja que todos os elementos dentro de um array sejam objetos, você pode usar o JavaScript Proxy para aplicar uma validação nos objetos antes de inseri-los em um array. É bem simples,

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

Agora, se você tentar fazer algo assim:

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

Isso gerará um erro. No entanto, se você inserir um objeto, ele será permitido:

arr[0] = {}; // Allowed

Para obter mais detalhes sobre Proxies, consulte este link: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Se você estiver procurando por uma implementação de polyfill, pode verificar este link: https://github.com/GoogleChrome/proxy-polyfill


1

O código abaixo do meu projeto talvez seja bom para você

  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;

Alguém tente isso .. e sugira algo.


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

1
Não. Essa é uma matriz não vazia de um objeto.
Quentin

Bem-vindo ao Stack Overflow! Embora este trecho de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo a pergunta para leitores no futuro, e essas pessoas podem não saber os motivos de sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, isso reduz a legibilidade do código e das explicações!
kayess
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.