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?

Prasath K
fonte
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({});
Daniel Imms
fonte
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" };
Frédéric Hamidi
fonte
@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.

Ced
fonte
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.

Jeff Shaver
fonte
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.

Eric Jablow
fonte
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(); });
MarzSocks
fonte
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.

spitterfly
fonte
5

Tente isto-

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

Abdallah Okasha
fonte
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())
}    
ashishdudhat
fonte
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);
Sachin Shah
fonte
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

Sachin Singh
fonte
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 });
}
Metin Atalay
fonte
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.

Cegone
fonte
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Matt
fonte
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