Как добавить объект в массив


317

Как я могу добавить объект в массив (в javascript или jquery)? Например, в чем проблема с этим кодом?

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

Я хотел бы использовать этот код, чтобы сохранить много объектов в массиве function1 и вызвать function2, чтобы использовать объект в массиве.

  1. Как я могу сохранить объект в массиве?
  2. Как я могу поместить объект в массив и сохранить его в переменной?

12
Пожалуйста, не исправляйте ошибки в размещенном коде, как редактировали 5. Если вы исправите простую ошибку в вопросе, часто нет никаких оснований для существования ответа.
Пол

Кроме того, pushуже было предложено несколько раз здесь. Пожалуйста, не загрязняйте эту тему другим pushпредложением.
Богьон Хоффманн

Ответы:


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': 'some 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) - это просто дополнительный шаг для предотвращения непреднамеренных мутаций.
Богьон Хоффманн

@jdmayfield: Но, как вы уже догадались, создание новых объектов каждый раз может быстро стать неэффективным, когда объекты становятся большими. Для таких случаев есть полезные библиотеки, которые делают его эффективным благодаря использованию постоянных структур данных, таких как Mori (своего рода мертвый) и 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
Привет, добро пожаловать в ТАК. Пожалуйста, не просто дамп код в ответ. Объясните свои мысли, чтобы пользователи могли лучше понять, что происходит. Спасибо.
Ктулху

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.