Оголошення масиву об'єктів


87

У мене є змінна, яка є масивом, і я хочу, щоб кожен елемент масиву за замовчуванням діяв як об’єкт. Для досягнення цього я можу зробити щось подібне у своєму коді.

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

Це чудово працює, але я не хочу згадувати жоден номер індексу. Я хочу, щоб усі елементи мого масиву були об'єктом. Як я можу це декларувати чи ініціалізувати?

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

Я спробував наведений вище код, але він не працює. Як ініціалізувати масив об’єктів, не використовуючи номер індексу?


1
Отже, ви намагаєтесь зробити усі об’єкти масиву об’єктами за замовчуванням?
Джефф Шевер

@Jeff Yupp, ти маєш рацію ..
Prasath K

Я не бачу сенсу в цьому. Можливо, розуміння, чому ви хочете зробити це таким чином, допомогло б нам зрозуміти, як насправді вирішити вашу проблему.
Джефф Шевер

1
Що в об’єктах? Здається, реалізація array.push(objYouWant )всередині функції, безумовно, є рішенням. Таким чином, кожного разу, коли функція запускається, вона додає новий об'єкт із будь-якими властивостями, які ви хочете.
Джефф Шевер

1
Я не розумію, як наявність їх автоматично як об’єктів допомогло б вашій ситуації.
Джефф Шевер

Відповіді:


90

Використовуйте array.push()для додавання елемента в кінець масиву.

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

Для цього nвикористовуйте forцикл.

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

Зверніть увагу , що ви також можете замінити new Array()з []і new Object()з {}таким стає:

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

38

В залежності від того, що ви маєте в виду декларування , ви можете спробувати використовувати літерали об'єктів в літералі масиву :

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

EDIT: Якщо вашою метою є масив, undefinedелементи якого за замовчуванням є порожніми літералами об’єктів, ви можете написати невелику функцію утиліти:

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

Тоді використовуйте його так:

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

Або навіть:

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

Звичайно, пряме присвоєння поверненого значення getDefaultObjectAt()не буде працювати, тому ви не можете писати:

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

@PrasathK, ти маєш на увазі, що ти заповнюєш свій масив динамічно (наприклад, через цикл)? Тоді ви повинні слідувати відповіді Даниїла та використовувати push().
Фредерік Хаміді

@PrasathK, цей голос проти не є моїм. Якщо я вас правильно розумію, коментар Джеффа Шевера на ваше запитання правильний?
Фредерік Хаміді

25

Ви можете використовувати 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 }));

Створить масив з 5 елементів. Тоді ви можете використовувати forEach, наприклад.

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

Зверніть увагу, що при цьому new Array(5)це просто об’єкт довжиною 5, а масив порожній. Коли ви використовуєте, fill()ви заповнюєте кожне окреме місце чим завгодно.


Я випадково побачив це на першій сторінці одразу після того, як ви опублікували. Це потрапило мені в очі, бо це було таке старе запитання з новою відповіддю.
мельпомена

Я думаю, що це важко використати та зрозуміти порівняно з іншими відповідями.
Sachin Shah

12

Побачивши, як ви відповіли в коментарях. Здається, було б найкраще використовувати те push, що пропонували інші. Таким чином, вам не потрібно знати індекси, але ви все одно можете додавати до масиву.

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

У цьому випадку кожного разу, коли ви використовуєте цю функцію, вона буде штовхати новий об'єкт до масиву.


О, боже .. у мене є більше 100 змінних у цих об’єктах, і для кожного об’єкта чи виклику функції я повинен ініціалізувати деякі значення для деяких змінних на початку функції
Prasath K

11

Вам не потрібно створювати порожні Objectфайли ніколи. З ними нічого не поробиш. Просто додайте свої робочі об'єкти до зразка за необхідності. Використовуйте, pushяк запропонував Даніель Іммс, і використовуйте літерали, як запропонував Фредерік Хаміді. Здається, ви хочете запрограмувати Javascript як 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. */

Я вважаю, що використання new Array(10)створює масив з 10 undefinedелементами.


10

Ви можете створити екземпляр масиву "типу об'єкта" в одному рядку, як це (просто замініть новий Object () на ваш об'єкт):

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

2
Що робити, якщо я не знаю значення елементів?
Prasath K

6

Ну array.lengthварто робити трюк чи ні? щось на кшталт, я маю на увазі, що вам не потрібно знати діапазон індексу, якщо ви його просто прочитали ..

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

Можливо, я неправильно зрозумів ваше запитання, але ви повинні мати можливість отримати довжину вашого масиву таким чином і перетворити їх на об'єкти. Чесно кажучи, Даніель дав ту саму відповідь. Ви можете просто зберегти довжину масиву в його змінну, і це буде зроблено.

ЯКЩО це не повинно відбуватися, на мій погляд, ви не можете отримати довжину масиву. Як ви сказали без отримання індексного номера, ви можете зробити це так:

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

Це не приємна версія наведеної вище, але цикл буде виконуватися, поки ви не "вибігнете" з діапазону індексів.


5

Спробуйте це-

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

Це робить об’єктом лише один елемент .. Я хочу, щоб усі мої елементи були об’єктом
Prasath K

1
@ShuklaSannidhya У цій публікації відсутнє пояснення того, що це робить, і чому ви це рекомендуєте. ...просто кажу.
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); 

Цей приклад працює зі мною. Знімок виводу на консолі браузера


1

Використовуйте array.push (), щоб додати елемент у кінець масиву.

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

ви можете ним скористатися

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

1

Використовуючи forEach, ми можемо зберігати дані на випадок, якщо у нас вже є дані, для яких ми хочемо здійснити певний логін для бізнесу на даних.

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

Приклад використання цикла simple for

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

1

Якщо ви хочете, щоб усі елементи всередині масиву були об'єктами, ви можете використовувати проксі-сервер JavaScript, щоб застосувати перевірку до об'єктів, перш ніж вставляти їх у масив. Це досить просто,

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

Тепер, якщо ви спробуєте зробити щось подібне:

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

Це призведе до помилки. Однак якщо ви вставите об'єкт, це буде дозволено:

arr[0] = {}; // Allowed

Детальніше про проксі-сервіси див. За цим посиланням: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy

Якщо ви шукаєте реалізацію polyfill, ви можете перевірити це посилання: https://github.com/GoogleChrome/proxy-polyfill


1

Наведений нижче код з мого проекту, можливо, це добре для вас

  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;

Хтось спробує це .. і запропонуйте щось.


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

1
Ні. Це не пустий масив одного об’єкта.
Квентін

Ласкаво просимо до Stack Overflow! Незважаючи на те, що цей фрагмент коду може вирішити питання, включення пояснення дійсно допомагає поліпшити якість вашої публікації. Пам’ятайте, що ви будете відповідати на запитання для читачів у майбутньому, і ці люди можуть не знати причин вашої пропозиції коду. Будь ласка, також намагайтеся не переповнювати свій код пояснювальними коментарями, це зменшує читабельність як коду, так і пояснень!
kayess
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.