Объявление массива объектов

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 01
Не вижу в этом смысла. Возможно, понимание того, почему вы хотите сделать это таким образом, поможет нам понять, как на самом деле решить вашу проблему.
Джефф Шейвер
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 = [{}, {}, {} /*, ... */];

РЕДАКТИРОВАТЬ: если вашей целью является массив, 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, это не мой голос против. Если я вас правильно понял, комментарий Джеффа Шейвера под вашим вопросом правильный?
Фредерик Хамиди
24

Вы можете использовать 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()вы заполняете каждое отдельное место тем, что хотите.

Ced
источник
Я случайно увидел это на первой странице сразу после того, как вы написали. Это привлекло мое внимание, потому что это был такой старый вопрос с новым ответом.
melpomene
Я думаю, что это сложно использовать и понять по сравнению с другими ответами.
Sachin Shah
12

Увидев, как вы ответили в комментариях. Кажется, лучше всего использоватьpush как предлагали другие. Таким образом, вам не нужно знать индексы, но вы все равно можете добавлять их в массив.

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

В этом случае каждый раз, когда вы используете эту функцию, она помещает новый объект в массив.

Джефф Шейвер
источник
О боже ... у меня более 100 переменных в этих объектах, и для каждого объекта или вызова функции я должен инициализировать некоторые значения для некоторых переменных в начале функции
Прасат К. 01
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

Вы можете создать экземпляр массива «объектного типа» в одной строке следующим образом (просто замените new 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({});
ШуклаСаннидхья
источник
Это делает только один элемент объектом .. Я хочу, чтобы все мои элементы были объектами
Прасат К. 01
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);

Пример использования простого цикла 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.

Если вы ищете реализацию полифилла, вы можете проверить эту ссылку: 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;

Кто-нибудь попробует это .. и предложит что-нибудь.

Cegone
источник
-7
var ArrayofObjects = [{}]; //An empty array of objects.
Мэтт
источник
1
Нет. Это непустой массив из одного объекта.
Квентин
Добро пожаловать в Stack Overflow! Хотя этот фрагмент кода может решить вопрос, включение объяснения действительно помогает улучшить качество вашего сообщения. Помните, что вы отвечаете на вопрос читателей в будущем, и эти люди могут не знать причины вашего предложения кода. Также постарайтесь не загромождать свой код пояснительными комментариями, это снижает удобочитаемость как кода, так и пояснений!
kayess