如何将对象添加到数组

IT技术 javascript jquery arrays function object
2021-01-27 06:59:32

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

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

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

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

使用 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
2021-03-14 06:59:32
似乎有些不对劲。确保没有范围界定问题。使用 let/var 来声明 myArray。因为 myArray.push 总是会改变 myArray。
2021-03-15 06:59:32
var years = [];
for (i= 2015;i<=2030;i=i+1){
    years.push({operator : i})
}

这里的数组年份具有类似的值

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

它继续这样。

首先,没有objector arrayObjectArray其次,你可以这样做:

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

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

+1 表示最简单的答案。我在下面对其进行了扩展,以包含对 OP 问题 2 的回答。
2021-03-23 06:59:32

使用ES6符号,您可以执行以下操作:

对于附加,您可以像这样使用扩展运算符

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

  • JavaScript区分大小写调用new array()andnew 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.
@jdmayfield:但是正如您可能已经猜到的那样,当对象变大时,每次创建新对象可能很快就会变得效率低下。对于这种情况,有一些有用的库,它们通过利用持久性数据结构来提高效率,例如Mori(有点死)和Immutable.js这里是“为什么不变性”的简短介绍:youtu.be/e-5obm1G_FY
2021-03-14 06:59:32
“使用”是使这成为我个人首选答案的原因。
2021-03-20 06:59:32
@jdmayfield:JS 的评估策略是通过对象共享调用当对象被传递时,它们不会被复制。这些对象中的突变在被传递时,总是立即对调用者可见,无论 mutator 是否被异步调用、完成或未调用。由于此类副作用经常导致错误,因此我们将返回与原始对象分离的新对象。使对象不可变(例如 via freeze)只是防止意外突变的附加步骤。
2021-03-25 06:59:32
@boghyon,我对冻结和突变很好奇。您是在谈论由于 concat 方法而可能直接发生的对数组的更改,还是因为在执行“.concat()”的过程中可能从脚本的其他地方对数组进行的更改?如果是第二个,由于 javascript 是单线程的,即使在异步代码的情况下,也不应该自动阻止这种情况,因为至少在理论上,在方法完成之前不应返回控制权吗?
2021-04-11 06:59:32