如何将对象添加到数组中

时间:2011-06-06 15:05:48

标签: javascript arrays object

如何将对象添加到数组(在javascript或jquery中)? 例如,这段代码有什么问题?

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

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

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

15 个答案:

答案 0 :(得分:570)

使用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 :(得分:50)

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

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

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

答案 2 :(得分:49)

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

这里数组年代的值是

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

它继续这样。

答案 3 :(得分:19)

  • JavaScript是case-sensitive。调用new array()new object()会抛出ReferenceError,因为它们不存在。
  • 最好避免因error-prone behavior new Array()而导致= [val1, val2, val_n] 而是使用= {}分配新数组。对于对象,请使用push
  • 扩展数组的方法有很多种(如John answer所示),但最安全的方法就是使用concat代替concatpush返回一个新数组,保持原始数组不变。 function appendObjTo(thatArray, newObj) { const frozenObj = Object.freeze(newObj); return Object.freeze(thatArray.concat(frozenObj)); } 改变调用数组should be avoided,特别是如果数组是全局定义的。
  • freeze对象以及新数组也是一种很好的做法,以避免意外的突变。冻结的对象既不可变也不可扩展(浅)。

应用这些要点并回答你的两个问题,你可以定义一个这样的函数:

// 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.

用法:

<img id = "myPhoto" src="img1.JPG" alt= "">
<scipt src = "script.js"> </scipt>

#myPhoto{
  margin: 20px 10%;
  width: 80%;
  height: 600px;
}

答案 4 :(得分:13)

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

对于追加,您可以像这样使用spread operator

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

答案 5 :(得分:8)

扩大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...

答案 6 :(得分:6)

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

答案 7 :(得分:4)

关于altativ的答案就是这个。

如果你有这样的数组:<div id="test" contenteditable="true" class="edit-box"> How to style the span element<span class="lb"></span>so it's possible to place the cursor at the beginning of this line, before "S". </div>

并且您想在此数组中放入另一个数组,您可以这样做:

声明函数构造函数

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

答案 8 :(得分:4)

通过推送,您甚至可以将多个对象添加到数组中

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

答案 9 :(得分:3)

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

答案 10 :(得分:3)

/* 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.push(new Data("Jhon", "Doe"));
aData.push(new Data("Anna", "Smith"));
aData.push(new Data("Black", "Pearl"));

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

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

答案 11 :(得分:2)

我使用自动列表创建对象创建者的方式:

var list = [];

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

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

答案 12 :(得分: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

答案 13 :(得分:0)

性能

今天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个元素的小型数组-您可以运行HERE
  • 对于具有1M个元素的大数组-您可以运行它HERE

以下代码段显示了解决方案之间的差异 ABCDEF

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!

这是铬的示例结果

enter image description here

答案 14 :(得分:-1)

You can use this prototype of javascript like this:

Array.prototype.push.apply(array1, array2,array3);

=> array1 contains the rest of them