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

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个回答

6

另一种答案是这个。

如果你有一个像这样的数组: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;

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

7
你好,欢迎来到 Stack Overflow。请不要只是贴上代码作为答案。解释一下你的想法,以便用户更好地理解发生了什么。谢谢。 - Cthulhu

3
我使用自动列表创建了对象生成器的方式:
var list = [];

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

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

2

性能

今天2020.12.04,我在Chrome v86、Safari v13.1.2和Firefox v83上对选择的解决方案在MacOs HighSierra 10.13.6上进行了测试。

结果

对于所有浏览器:

  • 基于length(B)的原地解决方案在小数组中最快,在Firefox中也适用于大数组,在Chrome和Safari中速度较快
  • 基于push(A)的原地解决方案在Chrome和Safari上适用于大数组,在Firefox和小数组上速度也很快
  • 原地解决方案C对大数组来说速度较慢,对小数组来说中等快速
  • 非原地解决方案D和E对大数组来说速度较慢
  • 非原地解决方案E、F和D(在Firefox上)对小数组来说速度较慢

enter image description here

细节

我进行了2个测试案例:

  • 对于包含10个元素的小数组-您可以在此处运行它
  • 对于包含100万个元素的大数组-您可以在此处运行它

下面的代码段介绍了解决方案之间的差异:ABCDEF

PS:答案B已被删除-但实际上它是第一个使用这种技术的答案,因此如果您有权限查看它,请单击“取消删除”。

// https://dev59.com/5G025IYBdhLWcg3wChOc#6254088
function A(a,o) {
  a.push(o);
  return a;
} 

// https://stackoverflow.com/a/47506893/860099
function B(a,o) {
  a[a.length] = o;
  return a;
} 

// https://dev59.com/5G025IYBdhLWcg3wChOc#6254088
function C(a,o) {
  return a.concat(o);
}

// https://dev59.com/5G025IYBdhLWcg3wChOc#50933891
function D(a,o) {
  return [...a,o];
}

// https://dev59.com/5G025IYBdhLWcg3wChOc#42428064
function E(a,o) {
  const frozenObj = Object.freeze(o);
  return Object.freeze(a.concat(frozenObj));
}

// https://dev59.com/5G025IYBdhLWcg3wChOc#6254088
function F(a,o) {
  a.unshift(o);
  return a;
} 


// -------
// TEST
// -------


[A,B,C,D,E,F].map(f=> {
  console.log(`${f.name} ${JSON.stringify(f([1,2],{}))}`)
})
<script src="https://code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script>
  
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.20/lodash.min.js" integrity="sha512-90vH1Z83AJY9DmlWa8WkjkV79yfS2n2Oxhsi2dZbIv0nC4E6m5AbH8Nh156kkM7JePmqD6tcZsfad1ueoaovww==" crossorigin="anonymous"> </script>
  
This shippet only presents functions used in performance tests - it not perform tests itself!

以下是chrome的示例结果

在此输入图片描述


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

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