如何向数组中添加对象

我如何添加数组的对象(在javascript或jquery)? 例如,这段代码有什么问题?< / p >

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

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

  1. 如何在数组中保存对象?
  2. 我如何把一个对象放在一个数组中,并将其保存到一个变量?
1477740 次浏览

首先,没有objectarray。有ObjectArray。其次,你<强> < / >强能这样做:

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

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

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

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

如果这样使用代码,就会遇到作用域问题。如果您计划在函数之间使用它,则必须在函数之外声明它(或者如果调用它,则将其作为参数传递)。

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

扩展加比·普卡鲁的答案,包括对第2个问题的回答。

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


var c = a[0]; // c is now the object we inserted into a...
var years = [];
for (i= 2015;i<=2030;i=i+1){
years.push({operator : i})
}

这里数组years的值是

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

就像这样。

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

我用auto list创建对象的方法:

var list = [];


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


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

另一个答案是这样的。

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

/* 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);

将对象推入数组

使用ES6符号,你可以这样做:

对于追加,你可以像这样使用传播算子:

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

使用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}
);

性能

今天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个元素的小数组-你可以运行它在这里
  • 对于有1M个元素的大数组-你可以运行在这里
下面的片段展示了解决方案之间的差异 一个, B, C, D, E, F < / p >

PS:答案B被删除了——但实际上它是第一个使用这种技术的答案,所以如果你有机会看到它,请点击“取消删除”。

// https://stackoverflow.com/a/6254088/860099
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://stackoverflow.com/a/6254088/860099
function C(a,o) {
return a.concat(o);
}


// https://stackoverflow.com/a/50933891/860099
function D(a,o) {
return [...a,o];
}


// https://stackoverflow.com/a/42428064/860099
function E(a,o) {
const frozenObj = Object.freeze(o);
return Object.freeze(a.concat(frozenObj));
}


// https://stackoverflow.com/a/6254088/860099
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的示例结果

enter image description here

你可以像这样使用扩展运算符(…):

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


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


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