如何将对象添加到数组


317

如何将对象添加到数组(使用javascript或jquery)?例如,此代码有什么问题?

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

我想使用此代码在function1数组中保存许多对象,并调用function2在数组中使用该对象。

  1. 如何将对象保存在数组中?
  2. 如何将对象放入数组并将其保存到变量?

12
请不要像编辑5那样更正已发布代码中的错误。如果您纠正问题中的简单错误,通常就没有理由存在答案。
保罗

另外,push已经在这里建议过多次。请不要再以其他push建议污染此线程。
Boghyon Hoffmann '18

Answers:


630

使用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

首先,没有objectarray。有ObjectArray。其次,您可以这样做:

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

现在a将是一个b以其为唯一元素的数组。


4
+1为最不复杂的答案。我已经扩大了它下面包括回答OP的问题2
山姆

30

使用ES6表示法,您可以执行以下操作:

对于追加,您可以像下面这样使用spread运算符

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]。对于对象,请使用= {}
  • 扩展数组有多种方法(如John的答案所示),但最安全的方法是使用concat代替pushconcat返回一个新数组,保持原始数组不变。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 '18

@jdmayfield:JS的评估策略是通过对象共享调用的。传递对象时,不会复制它们。这些对象中的突变在被传递时始终对调用者立即可见,无论是否异步调用了变种器,是否完成了变种器。由于此类副作用通常会导致错误,因此我们将返回与原始对象分离的新对象。使对象不可变(例如通过freeze)只是防止意外突变的另一步骤。
Boghyon Hoffmann '18

@jdmayfield:但是,正如您可能已经猜到的那样,每次创建新对象时,当对象变大时,它们的效率可能很快变低。对于这种情况,有一些有用的库,可通过利用持久数据结构(例如Mori(有点死)和Immutable.js)来提高效率。以下是“为什么不可变”的简短介绍:youtu.be/e-5obm1G_FY
Boghyon Hoffmann '18年

9

扩展Gabi Purcaru的答案以包括对数字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显然是一个错字。但两者objectarray需要大写字母。

您可以使用空手,new Arraynew 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。请不要只是转储代码作为答案。解释您的想法,以便用户可以更好地了解正在发生的事情。谢谢。
克苏鲁

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.