例如,此代码有什么问题?
function(){
var a = new array();
var b = new object();
a[0]=b;
}
我想使用此代码将许多对象保存在function1的数组中,并调用function2以使用该数组中的对象。
如何将对象保存在数组中?
如何将对象保存在数组中并将其保存为变量?
#1 楼
使用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
16 Mar 16 '16 at 14:55
似乎不对劲。确保没有范围界定问题。使用let / var声明myArray。因为myArray.push将始终使myArray突变。
–约翰·斯特里克勒
16年3月16日在19:14
#2 楼
var years = [];
for (i= 2015;i<=2030;i=i+1)
{
years.push({operator : i})
}
这里的数组年具有类似的值
years[0]={operator:2015}
years[1]={operator:2016}
它会像这样继续。
#3 楼
首先,没有object
或array
。有Object
和Array
。其次,您可以执行以下操作:a = new Array();
b = new Object();
a[0] = b;
现在
a
将是一个以b
作为其唯一元素的数组。评论
+1为最不复杂的答案。我在下面进行了扩展,以包含对OP的问题2的答案。
–山姆
2011年6月6日15:34
#4 楼
使用ES6
表示法,您可以执行以下操作:对于附加操作,您可以使用以下传播操作符:
var arr1 = [1,2,3]
var obj = 4
var newData = [...arr1, obj] // [1,2,3,4]
console.log(newData);
#5 楼
JavaScript区分大小写。调用
new array()
和new object()
会抛出ReferenceError
,因为它们不存在。最好避免
new Array()
,因为它们容易出错。相反,请给新数组分配
= [val1, val2, val_n]
。对于对象,请使用= {}
。扩展数组有很多方法(如约翰的回答所示),但最安全的方法是仅使用
concat
而不是push
。 concat
返回一个新数组,保持原始数组不变。 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.
评论
“用法”是我个人首选的答案。
– HPWD
17-10-3在20:59
@boghyon,我对冻结和突变感到好奇。您是在谈论由于concat方法而直接发生的数组更改,还是由于在执行'.concat()'过程中脚本中其他位置可能对数组进行的更改?如果是第二种,是否应该由于javascript是单线程而自动防止这种情况发生,即使在异步代码的情况下,因为至少在理论上讲,直到方法完成后才应返回控制权?
– jdmayfield
18年2月1日在19:30
@jdmayfield:JS的评估策略是通过对象共享来调用的。传递对象时,不会复制它们。这些对象中的突变在被传递时始终对调用者立即可见,无论是否异步调用了变种器,是否完成了变种器。由于此类副作用通常会导致错误,因此我们将返回与原始对象分离的新对象。使对象不可变(例如通过冻结)只是防止意外突变的附加步骤。
– Boghyon Hoffmann
18年2月1日在22:36
@jdmayfield:但是,正如您可能已经猜到的那样,每次创建新对象时,一旦对象变大,它们的效率可能会很快降低。对于这种情况,有一些有用的库,可通过利用持久数据结构(例如Mori(死于死)和Immutable.js)提高效率。这是“为什么不可变”的简短介绍:youtu.be/e-5obm1G_FY
– Boghyon Hoffmann
18年2月1日在22:45
#6 楼
/* array literal */
var aData = [];
/* object constructur */
function Person(firstname, lastname) {
this.firstname = firstname;
this.lastname = lastname;
this.fullname = function() {
return (this.firstname + " " + this.lastname);
};
}
/* store object into array */
aData[aData.length] = new Person("Java", "Script"); // aData[0]
aData.push(new Person("Jhon", "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);
将对象推入数组
#7 楼
扩展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 楼
obejct
显然是一个错字。但是object
和array
都需要大写字母。 您可以使用
new Array
和new 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();
#9 楼
如果您有这样的数组:
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;
#10 楼
a=[];
a.push(['b','c','d','e','f']);
评论
嗨,欢迎来到SO。请不要只是转储代码作为答案。解释您的想法,以便用户可以更好地了解正在发生的事情。谢谢。
–克苏鲁
16 Mar 17 '16 at 9:50
#11 楼
通过推,您甚至可以将多个对象添加到数组中。 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 楼
我使用自动列表创建对象创建者的方式:var list = [];
function saveToArray(x) {
list.push(x);
};
function newObject () {
saveToArray(this);
};
#13 楼
如果这样使用代码,则会遇到范围问题。如果打算在函数之间使用它,则必须在函数外部声明它(或者,如果调用,请将其作为参数传递)。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
#14 楼
性能今天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对于大型阵列来说很慢,而对于小型非就地解决方案的C中等,但是对于大型阵列来说很慢
非现场解决方案E,F和D(在Firefox上)对于小型阵列比较慢
详细信息
我执行了2个测试案例:
对于具有10个元素的小型阵列-您可以在此处运行
对于具有1M元素的大型阵列-您可以在此处运行
下面的代码片段介绍了解决方案之间的区别
A,
B,
C,
E,
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!
这是铬的示例结果
评论
请不要像编辑5那样更正已发布代码中的错误。如果您纠正问题中的简单错误,通常就没有理由存在答案。另外,这里已经多次建议进行推送。请不要再用其他推送建议来污染此线程。