如何将一个对象添加到数组中

396

我该如何在 JavaScript 或 jQuery 中向数组添加一个对象?举个例子,这段代码有什么问题?

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

我想使用这段代码将许多对象保存在function1的数组中,并调用function2来使用数组中的对象。

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

22
请不要更正已发布的代码中的错误,就像第5次编辑所做的那样。如果您更正了问题中的简单错误,通常就没有回答存在的理由了。 - Paul
4
此处已经多次建议使用push方法。请不要再通过提出push建议来污染本讨论串。请理解为否定推荐push方法。 - Boghyon Hoffmann
15个回答

762

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

1
我还有一个问题:myArray = []; myArray.push({'text': 'some text', 'id' : 13}); 现在myArray是空的。所以如果我们尝试从myArray [0] ['text']获取值,它将为空,为什么?http://take.ms/jSvbn - fdrv
似乎有些不对劲。确保没有作用域问题。使用let/var声明myArray。因为myArray.push将始终改变myArray。 - John Strickler

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

这里的数组years的值如下:

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

它就这样继续下去。


64

首先,不存在objectarray。存在的是ObjectArray。其次,你确实可以这样做:

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

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


4
最不太复杂的答案加一分。我把下面的内容扩展了一下,以便回答原帖中的第二个问题。翻译:+1 表示最简单明了的答案。我在下文中进行了扩展,回答了原贴中的第二个问题。 - Sam

60

使用ES6语法,可以像这样做:

要进行追加操作,可以使用展开运算符,如下所示:

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


26
  • 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
@jdmayfield:JS的求值策略是共享对象调用。当对象被传递时,它们不会被复制。这些对象中的变异,在传递过程中,无论变异器是异步调用、已完成还是未完成,都会立即对调用者可见。由于这种副作用经常导致错误,我们返回一个新对象,与原始对象解耦。使对象不可变(例如通过freeze)只是防止意外变异的额外步骤。 - Boghyon Hoffmann
@jdmayfield:但是你可能已经猜到了,每次创建新对象时,当对象变得庞大时,效率可能会迅速降低。对于这种情况,有一些有用的库,通过利用持久化数据结构(如Mori(有点死)和Immutable.js),使其更加高效。这里有一个关于“为什么要使用不可变性”的简短介绍:youtu.be/e-5obm1G_FY - Boghyon Hoffmann

19

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

/* object constructur */
function Person(firstname, lastname) {
  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = function() {
    // return (this.firstname + " " + this.lastname);
    return (`${this.firstname} ${this.lastname}`); // es6 template string
  };
}

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

aData.push(new Person("John", "Doe"));
aData.push(new Person("Anna", "Smith"));
aData.push(new Person("Black", "Pearl"));

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

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

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

将对象推入数组


14

使用 push 方法,您甚至可以将多个对象添加到数组中。

  let myArray = [];

   myArray.push(
              {name:"James", dataType:TYPES.VarChar, Value: body.Name},
              {name:"Boo", dataType:TYPES.VarChar, Value: body.Name},
              {name:"Alina", dataType:TYPES.VarChar, Value: body.Name}
             );

12
您可以像这样使用扩展运算符(...):

let arr = [{num: 1, char: "a"}, {num: 2, char: "b"}];

arr = [...arr,{num: 3, char: "c"}];

//...arr --> spread operator
console.log(arr);


将对象添加到数组的完美解决方案 - Mohamed Raza

10

扩展Gabi Purcaru的答案,包括对第二个问题的回答。

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

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

8

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接