Nesne dizisi bildirme


87

Dizi olan bir değişkenim var ve dizinin her elemanının varsayılan olarak bir nesne olarak hareket etmesini istiyorum. Bunu başarmak için kodumda buna benzer bir şey yapabilirim.

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

Bu iyi çalışıyor, ancak herhangi bir dizin numarasından bahsetmek istemiyorum. Dizimin tüm elemanlarının bir nesne olmasını istiyorum. Nasıl beyan ederim veya başlatırım?

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

Yukarıdaki kodu denedim ama çalışmıyor. Bir dizin numarası kullanmadan bir nesne dizisini nasıl başlatabilirim?


1
Öyleyse varsayılan olarak tüm dizi öğelerini nesneler yapmaya mı çalışıyorsunuz?
Jeff Shaver 13

@Jeff Yupp, haklısın ..
Prasath K

Bunu yapmanın anlamını görmüyorum. Belki de bunu neden bu şekilde yapmak istediğinizi anlamak, probleminizi nasıl çözeceğimizi anlamamıza yardımcı olabilir.
Jeff Shaver 13

1
Nesnelerin içinde ne var? Görünüşe göre array.push(objYouWant ), işlevin içinde uygulamak kesinlikle çözüm olacaktır. Bu şekilde işlev her çalıştırıldığında, istediğiniz özelliklere sahip yeni bir nesne ekler.
Jeff Shaver 13

1
Bunların otomatik olarak nesne olmasına sahip olmanın durumunuza nasıl yardımcı olacağını anlamıyorum.
Jeff Shaver 13

Yanıtlar:


90

array.push()Dizinin sonuna bir öğe eklemek için kullanın .

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

Bunu yapmak niçin bir fordöngü kullanın .

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

Ayrıca yerine unutmayın new Array()ile []ve new Object()ile {}o olur böylece:

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

38

Derken ne demek istediğine bağlı bildirerek , sen kullanmayı deneyebilirsiniz nesne değişmezleri bir in Array değişmez :

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

DÜZENLEME: Hedefiniz, undefinedöğeleri varsayılan olarak boş nesne değişmezleri olan bir diziyse, küçük bir yardımcı program işlevi yazabilirsiniz:

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

O zaman şu şekilde kullanın:

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

Ya da:

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

Tabii ki, dönüş değerine doğrudan atama getDefaultObjectAt()çalışmayacaktır, bu nedenle yazamazsınız:

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

@PrasathK, dizinizi dinamik olarak doldurduğunuz anlamına mı geliyor (örneğin bir döngü aracılığıyla)? O zaman Daniel'in cevabını takip etmeli ve kullanmalısınız push().
Frédéric Hamidi

@PrasathK, bu olumsuz oy benim değil. Sizi doğru anladıysam, Jeff Shaver'ın sorunuzun altındaki yorumu doğru mu?
Frédéric Hamidi

26

Fill () kullanabilirsiniz .

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

5 öğelik bir dizi oluşturacaktır. O zaman örneğin forEach'i kullanabilirsiniz.

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

Bunu yaparken new Array(5)sadece 5 uzunluğunda bir nesne olduğunu ve dizinin boş olduğunu unutmayın. Kullandığınızda, fill()her bir noktayı istediğiniz şeyle doldurursunuz.


Siz gönderdikten hemen sonra ön sayfada görmüştüm. Gözüme çarptı çünkü yeni yanıtı olan çok eski bir soruydu.
melpomene

Bence bu, diğer cevaplara göre kullanımı ve anlaşılması zor.
Sachin Shah

12

Yorumlarda nasıl yanıt verdiğinizi gördükten sonra. pushBaşkalarının önerdiği şekilde kullanmak en iyisi gibi görünüyor . Bu şekilde dizinleri bilmenize gerek kalmaz, ancak yine de diziye ekleyebilirsiniz.

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

Bu durumda, bu işlevi her kullandığınızda, diziye yeni bir nesne gönderecektir.


Tanrım .. Bu nesnelerde 100'den fazla değişkenim var ve işlevin her bir nesnesi veya çağrısı için işlevin başlangıcındaki bazı değişkenler için bazı değerleri başlatmam gerekiyor
Prasath K

11

Hiç boş Objecte-postalar yaratmanıza gerek yok . Onlarla hiçbir şey yapamazsınız. Çalışma nesnelerinizi gerektiği gibi numuneye ekleyin. pushDaniel Imms'in önerdiği gibi kullanın ve Frédéric Hamidi'nin önerdiği gibi harfleri kullanın. Javascript'i C gibi programlamak istiyor gibisin.

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. */

Kullanmanın new Array(10)10 undefinedelemanlı bir dizi oluşturduğuna inanıyorum .


10

Bir satırda bir "nesne türü" dizisini şu şekilde başlatabilirsiniz ( yeni Object () 'i nesnenizle değiştirin):

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

2
Ya elementlerin değerini bilmiyorsam?
Prasath K

6

Peki array.lengthhile yapmalı mı yapmamalı mı? gibi bir şey, yani eğer sadece okursanız, dizin aralığını bilmenize gerek yoktur ..

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

Belki Sorunuzu doğru anlamadım, ancak Array'inizin uzunluğunu bu şekilde alıp nesnelere dönüştürebilmelisiniz. Daniel dürüst olmak gerekirse aynı cevabı verdi. Dizi uzunluğunuzu onun değişkenine kaydedebilirsiniz ve bu yapılır.

EĞER ve bu benim görüşüme göre olmamalı, Dizi uzunluğunuzu alamazsınız. Dediğin gibi, dizin numarasını almadan bunu şu şekilde yapabilirsin:

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

Yukarıdakinin hoş olmayan sürümüdür, ancak döngü, siz dizin aralığının dışına "çıkana" kadar çalışacaktır.


5

Bunu dene-

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

Bu, yalnızca bir öğeyi bir nesne haline getirir .. Tüm öğelerimin bir nesne olmasını istiyorum
Prasath K

1
@ShuklaSannidhya Bu gönderi, bunun ne yaptığına ve neden önerdiğinize dair açıklamadan yoksundur. ...sadece söylüyorum.
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); 

Bu Örnek Benimle Çalışıyor. Tarayıcı Konsolundaki Çıktı için Anlık Görüntü


1

Dizinin sonuna bir öğe eklemek için dizi.push () kullanın.

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

kullanabilirsin

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

1

ForEach'i kullanarak, zaten veriye sahip olmamız durumunda verileri depolayabiliriz, veriler üzerinde bazı işletme girişi yapmak istiyoruz.

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

Basit for döngüsü kullanarak örnek

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

1

Bir dizideki tüm öğelerin nesne olmasını istiyorsanız, nesnelere bir diziye eklemeden önce doğrulama uygulamak için JavaScript Proxy'yi kullanabilirsiniz. Oldukça basit

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

Şimdi böyle bir şey yapmaya çalışırsanız:

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

Bir hata atacak. Bununla birlikte, bir nesne eklerseniz, buna izin verilir:

arr[0] = {}; // Allowed

Proxy'ler hakkında daha fazla ayrıntı için lütfen şu bağlantıya bakın: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Bir çoklu dolgu uygulaması arıyorsanız, şu bağlantıyı kontrol edebilirsiniz: https://github.com/GoogleChrome/proxy-polyfill


1

Projemdeki aşağıdaki kod sizin için iyi olabilir

  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;

Bunu deneyen ... ve bir şey önerin.


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

1
Hayır. Bu, boş olmayan bir nesne dizisi .
Quentin

Stack Overflow'a hoş geldiniz! Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtlayacağınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
kayess
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.