Deklarowanie tablicy obiektów

87

Mam zmienną, która jest tablicą i chcę, aby każdy element tablicy działał domyślnie jako obiekt. Aby to osiągnąć, mogę zrobić coś takiego w moim kodzie.

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

Działa to dobrze, ale nie chcę wspominać o żadnym numerze indeksu. Chcę, aby wszystkie elementy mojej tablicy były obiektami. Jak to zadeklarować lub zainicjować?

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

Wypróbowałem powyższy kod, ale nie działa. Jak zainicjować tablicę obiektów bez użycia numeru indeksu?

Prasath K.
źródło
1
Więc czy próbujesz domyślnie utworzyć wszystkie obiekty tablicy?
Jeff Shaver
@Jeff Yupp, masz rację ...
Prasath K
Nie widzę sensu w tym. Może zrozumienie, dlaczego chcesz to zrobić w ten sposób, pomogłoby nam zrozumieć, jak faktycznie rozwiązać Twój problem.
Jeff Shaver
1
Co jest w przedmiotach? Wygląda na to, że implementacja array.push(objYouWant )wewnątrz funkcji zdecydowanie byłaby rozwiązaniem, dlatego za każdym razem, gdy funkcja jest uruchamiana, dodaje nowy obiekt o dowolnych właściwościach.
Jeff Shaver
1
Nie rozumiem, w jaki sposób posiadanie ich automatycznie jako obiektów pomogłoby w twojej sytuacji.
Jeff Shaver

Odpowiedzi:

90

Służy array.push()do dodawania elementu na końcu tablicy.

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

Aby to zrobić, nużyj forpętli.

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

Należy pamiętać, że można również zastąpić new Array()z []i new Object()z {}tak staje się:

var n = 100;
var sample = [];
for (var i = 0; i < n; i++)
    sample.push({});
Daniel Imms
źródło
38

W zależności od tego, co masz na myśli przez deklarując , można spróbować użyć literałów obiektów w dosłownym tablicy :

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

EDYCJA: Jeśli Twoim celem jest tablica, której undefinedelementy są domyślnie pustymi literałami obiektów, możesz napisać małą funkcję użytkową:

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

Następnie użyj tego w ten sposób:

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

Lub nawet:

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

Oczywiście bezpośrednie przypisanie do zwracanej wartości getDefaultObjectAt()nie zadziała, więc nie możesz napisać:

getDefaultObjectAt(sample, 2) = { prop: "val" };
Frédéric Hamidi
źródło
@PrasathK, czy masz na myśli, że wypełniasz swoją tablicę dynamicznie (np. Poprzez pętlę)? Następnie powinieneś postępować zgodnie z odpowiedzią Daniela i używać push().
Frédéric Hamidi
@PrasathK, ten głos nie jest mój. Jeśli dobrze cię rozumiem, komentarz Jeffa Shavera pod twoim pytaniem jest słuszny?
Frédéric Hamidi
24

Możesz użyć 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 }));

Stworzy tablicę składającą się z 5 elementów. Następnie możesz użyć na przykład forEach.

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

Zwróć uwagę, że robiąc new Array(5)to jest to tylko obiekt o długości 5, a tablica jest pusta. Kiedy używasz fill(), wypełniasz każde miejsce, czym chcesz.

Ced
źródło
Zdarzyło mi się to zobaczyć na pierwszej stronie zaraz po tym, jak opublikowałeś. Przykuło to moją uwagę, ponieważ było to takie stare pytanie z nową odpowiedzią.
melpomene
Myślę, że jest to trudne w użyciu i zrozumieniu w porównaniu z innymi odpowiedziami.
Sachin Shah
12

Po zobaczeniu, jak odpowiedziałeś w komentarzach. Wygląda na to, że najlepiej będzie go używać pushtak, jak sugerowali inni. W ten sposób nie musisz znać indeksów, ale nadal możesz dodawać do tablicy.

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

W takim przypadku za każdym razem, gdy użyjesz tej funkcji, wepchnie ona nowy obiekt do tablicy.

Jeff Shaver
źródło
O Boże ... mam ponad 100 zmiennych w tych obiektach i dla każdego obiektu lub wywołania funkcji muszę zainicjować pewne wartości dla niektórych zmiennych na początku funkcji
Prasath K
11

Tak naprawdę nie musisz Objectnigdy tworzyć pustych znaków. Nie możesz z nimi nic zrobić. Po prostu dodaj obiekty robocze do próbki w razie potrzeby. Używaj pushzgodnie z sugestią Daniela Immsa i literałów, jak sugerował Frédéric Hamidi. Wydaje się, że chcesz zaprogramować Javascript jak 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. */

Uważam, że użycie new Array(10)tworzy tablicę z 10 undefinedelementami.

Eric Jablow
źródło
10

Możesz utworzyć instancję tablicy „typu obiektu” w jednej linii w ten sposób (po prostu zastąp new Object () swoim obiektem):

var elements = 1000;
var MyArray = Array.apply(null, Array(elements)).map(function () { return new Object(); });
MarzSocks
źródło
2
Co jeśli nie znam wartości elementów?
Prasath K
6

Więc array.lengthpowinno załatwić sprawę, czy nie? coś w rodzaju, mam na myśli, że nie musisz znać zakresu indeksu, jeśli tylko go przeczytasz ..

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

Być może nie zrozumiałem poprawnie Twojego pytania, ale powinieneś być w stanie uzyskać w ten sposób długość swojej tablicy i przekształcić ją w obiekty. Daniel jakby udzielił tej samej odpowiedzi, jeśli mam być szczery. Możesz po prostu zapisać długość swojej tablicy w jego zmiennej i będzie gotowe.

JEŚLI i to nie powinno, moim zdaniem, nie możesz uzyskać swojej długości tablicy. Jak powiedziałeś bez uzyskania numeru indeksu, możesz to zrobić w następujący sposób:

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

Jest to niezbyt przyjemna wersja powyższej, ale pętla byłaby wykonywana, dopóki nie „wyjdziesz” poza zakres indeksu.

spitterfly
źródło
5

Spróbuj tego-

var arr = [];
arr.push({});
ShuklaSannidhya
źródło
To sprawia, że ​​tylko jeden element jest obiektem. Chcę, aby wszystkie moje elementy były obiektami
Prasath K
1
@ShuklaSannidhya W tym poście brakuje wyjaśnienia, co to robi i dlaczego go polecasz. ...tylko mówię.
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); 

Ten przykład działa ze mną. Migawka dla danych wyjściowych w konsoli przeglądarki

Abdallah Okasha
źródło
1

Użyj array.push (), aby dodać element na końcu tablicy.

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

możesz tego użyć

var x = 100;
var sample = [];
for(let i=0; i<x ;i++){
  sample.push({}) 
  OR
  sample.push(new Object())
}    
ashishdudhat
źródło
1

Korzystając z forEach, możemy przechowywać dane w przypadku, gdy mamy już dane, dla których chcemy wykonać logowanie biznesowe na danych.

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

Przykład z użyciem prostej pętli for

var data = [];
for(var i = 0 ; i < 10 ; i++){
   data.push(i);
}
document.write(data);
Sachin Shah
źródło
1

Jeśli chcesz, aby wszystkie elementy wewnątrz tablicy były obiektami, możesz użyć JavaScript Proxy, aby zastosować walidację obiektów przed wstawieniem ich do tablicy. To całkiem proste,

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

Teraz, jeśli spróbujesz zrobić coś takiego:

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

Wystąpi błąd. Jeśli jednak wstawisz obiekt, będzie to dozwolone:

arr[0] = {}; // Allowed

Więcej informacji na temat serwerów proxy można znaleźć pod tym linkiem: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Jeśli szukasz implementacji polyfill, możesz sprawdzić ten link: https://github.com/GoogleChrome/proxy-polyfill

Sachin Singh
źródło
1

Poniższy kod z mojego projektu może być dla Ciebie dobry

  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
źródło
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;

Każdy spróbuje tego… i coś zasugeruje.

Cegone
źródło
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Matt
źródło
1
Nie. To niepusta tablica jednego obiektu.
Quentin,
Witamy w Stack Overflow! Chociaż ten fragment kodu może rozwiązać problem, dołączenie wyjaśnienia naprawdę pomaga poprawić jakość Twojego posta. Pamiętaj, że odpowiadasz na pytanie do czytelników w przyszłości, a osoby te mogą nie znać powodów, dla których zaproponowałeś kod. Prosimy również starać się nie tłoczyć kodu komentarzami wyjaśniającymi, ponieważ zmniejsza to czytelność zarówno kodu, jak i wyjaśnień!
kayess