Як додати об’єкт до масиву


317

Як я можу додати об’єкт до масиву (у JavaScript або jquery)? Наприклад, яка проблема з цим кодом?

function(){
    var a = new array();
    var b = new object();
    a[0]=b;
}

Я хотів би скористатися цим кодом для збереження багатьох об'єктів у масиві function1, а call2 function2 використовувати об’єкт у масиві.

  1. Як я можу зберегти об'єкт у масиві?
  2. Як я можу помістити об'єкт у масив і зберегти його до змінної?

12
Будь ласка, не виправляйте помилки в опублікованому коді, як це робило редагування 5. Якщо ви виправляєте просту помилку у питанні, часто відповіді немає.
Павло

Також pushтут уже пропонували багато разів. Будь ласка, більше не забруднюйте цю нитку іншою pushпропозицією.
Boghyon Hoffmann

Відповіді:


631

Покладіть що-небудь у масив за допомогою Array.push ().

var a=[], b={};
a.push(b);    
// a[0] === b;

Додаткова інформація про масиви

Додайте одночасно кілька елементів

var x = ['a'];
x.push('b', 'c');
// x = ['a', 'b', 'c']

Додайте елементи до початку масиву

var x = ['c', 'd'];
x.unshift('a', 'b');
// x = ['a', 'b', 'c', 'd']

Додайте вміст одного масиву до іншого

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
x.push.apply(x, y);
// x = ['a', 'b', 'c', 'd', 'e', 'f']
// y = ['d', 'e', 'f']  (remains unchanged)

Створіть новий масив із вмісту двох масивів

var x = ['a', 'b', 'c'];
var y = ['d', 'e', 'f'];
var z = x.concat(y);
// x = ['a', 'b', 'c']  (remains unchanged)
// y = ['d', 'e', 'f']  (remains unchanged)
// z = ['a', 'b', 'c', 'd', 'e', 'f']

У мене також є питання: myArray = []; myArray.push ({'text': 'деякий текст', 'id': 13}); і тепер myArray порожній. Отже, якщо ми спробуємо отримати значення з myArray [0] ['text'], воно буде порожнім, чому? take.ms/jSvbn
fdrv

Щось не здається правильним. Переконайтеся, що не існує проблеми з визначенням масштабів. Використовуйте let / var для оголошення myArray. Тому що myArray.push завжди буде змінювати myArray.
Джон Стріклер

58
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}

тут років масиву має такі значення, як

years[0]={operator:2015}
years[1]={operator:2016}

воно триває так.


55

Перш за все, немає objectабо array. Є Objectі Array. По-друге, ви можете це зробити:

a = new Array();
b = new Object();
a[0] = b;

Тепер aбуде масив з bєдиним його елементом.


4
+1 за найменш складну відповідь. Я розширив його нижче, щоб включити відповідь на питання ОП 2.
Сем

30

Використовуючи ES6позначення, ви можете зробити щось подібне:

Для додавання ви можете використовувати оператор розвороту таким чином:

var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);


20
  • JavaScript залежить від регістру . Подзвони new array()і new object()кинеш, ReferenceErrorоскільки їх не існує.
  • Краще уникати new Array()через поведінку, схильну до помилок .
    Замість цього призначте новий масив за допомогою = [val1, val2, val_n]. Для об’єктів використовуйте = {}.
  • Є багато способів , коли мова заходить про розширення масиву (як показано на Джона відповіді ) , але найбезпечніший спосіб буде просто використовувати concatзамість push. concatповертає новий масив, залишаючи початковий масив недоторканим. pushмутує виклик масиву, якого слід уникати , особливо якщо масив визначений глобально.
  • Це також хороша практика заморозити об'єкт, а також новий масив, щоб уникнути ненавмисних мутацій. Заморожений предмет не є ні змінним, ні розширюваним (неглибоко).

Застосувавши ці пункти і відповівши на два ваші запитання, ви можете визначити функцію на зразок цієї:

function appendObjTo(thatArray, newObj) {
  const frozenObj = Object.freeze(newObj);
  return Object.freeze(thatArray.concat(frozenObj));
}

Використання:

// Given
const myArray = ["A", "B"];
// "save it to a variable"
const newArray = appendObjTo(myArray, {hello: "world!"});
// returns: ["A", "B", {hello: "world!"}]. myArray did not change.

2
"Використання" - це те, що зробило це моєю особистою перевагою відповіді.
HPWD

@boghyon, мені цікаво заморожування та мутації. Ви говорите про зміни в масиві, які можуть відбутися безпосередньо через метод concat або через зміни, які можуть бути внесені до масиву з інших місць сценарію, під час виконання ".concat ()"? Якщо друге, чи не слід цього автоматично запобігати через однопоточний javascript, навіть у випадку асинхронного коду, оскільки управління, принаймні теоретично, не повинно бути повернене до завершення методу?
jdmayfield

@jdmayfield: Стратегія оцінювання JS викликає обмін об'єктами . Коли об'єкти передаються навколо, вони не копіюються. Мутації в цих об'єктах, переходячи навколо, завжди одразу видно абонентам, незалежно від того, називався мутатор асинхронним, завершеним чи ні. Оскільки такі побічні ефекти часто призводять до помилок, ми повертаємо новий об’єкт, відокремлений від початкового. Зробити об'єкти незмінними (наприклад, через freeze) - лише додатковий крок для запобігання ненавмисних мутацій.
Boghyon Hoffmann

@jdmayfield: Але, як ви вже здогадалися, створення нових об'єктів щоразу може стати неефективним швидко, коли об'єкти стануть величезними. Для таких випадків є корисні ліфти, які роблять його ефективним за рахунок використання стійких структур даних, таких як Морі (щось на кшталт мертвих) та Immutable.js . Ось короткий вступ до "чому незмінність": youtu.be/e-5obm1G_FY
Boghyon Hoffmann

9

Розширення відповіді Габі Пуркару на включення відповіді на номер 2.

a = new Array();
b = new Object();
a[0] = b;

var c = a[0]; // c is now the object we inserted into a...

8

/* array literal */
var aData = [];

/* object constructur */
function Data(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    return (this.firstname + " " + this.lastname);
  };
}

/* store object into array */
aData[aData.length] = new Data("Java", "Script"); // aData[0]

aData.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

aData[aData.length] = new Data("stack", "overflow"); // aData[4]

/* loop arrray */
for (var x in aData) {
  alert(aData[x].fullname());
}

/* convert array of object into string json */
var jsonString = JSON.stringify(aData);
document.write(jsonString);


7

obejctявно друкарська справа. Але обом objectі arrayпотрібні великі літери.

Ви можете використовувати короткі руки для, new Arrayі new Objectце є []і{}

Ви можете натиснути дані в масив, використовуючи .push. Це додає його до кінця масиву. або ви можете встановити індекс, який містить дані.

function saveToArray() {
    var o = {};
    o.foo = 42;
    var arr = [];
    arr.push(o);
    return arr;
}

function other() {
    var arr = saveToArray();
    alert(arr[0]);
}

other();

5

На альтернативну відповідь це.

якщо у вас є такий масив: var contacts = [bob, mary];

і ви хочете поставити інший масив у цей масив, ви можете зробити це таким чином:

Оголосіть конструктор функції

function add (firstName,lastName,email,phoneNumber) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
this.phoneNumber = phoneNumber;
}

зробити об'єкт з функції:

var add1 = new add("Alba","Fas","Des@gmail.com","[098] 654365364");

і додайте об'єкт до масиву:

contacts[contacts.length] = add1;

3
a=[];
a.push(['b','c','d','e','f']);

6
Привіт, ласкаво просимо до SO. Будь ласка, не просто дамп-код як відповідь. Поясніть свої думки, щоб користувачі могли краще зрозуміти, що відбувається. Дякую.
Cthulhu

2

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

var list = [];

function saveToArray(x) {
    list.push(x);
};

function newObject () {
    saveToArray(this);
};

0

У вас виникає проблема із сферою застосування, якщо ви використовуєте код як такий. Ви повинні оголосити його поза межами функцій, якщо ви плануєте використовувати їх між ними (або якщо дзвоните, передайте його як параметр).

var a = new Array();
var b = new Object();

function first() {
a.push(b);
// Alternatively, a[a.length] = b
// both methods work fine
}

function second() {
var c = a[0];
}

// code
first();
// more code
second();
// even more code
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.