数组推送行为

4

虽然我有一些基础的JavaScript背景,但我写下了以下代码:

var data=[{"_id":"57b3e7ec9b209674f1459f36","fName":"Tom","lName":"Moody","email":"Tom@example.com","age":30},{"_id":"57b3e8079b209674f1459f37","fName":"Pat","lName":"Smith","email":"pat@example.com","age":32},{"_id":"57b3e8209b209674f1459f38","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28},{"_id":"57b3e8219b209674f1459f39","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28}]
var tempArr=[];
var table=[];
var dataArr = Object.keys(data).map(function(k) { return data[k] });
dataArr.forEach(function(user) {
  tempArr[0]=user.fName;
  tempArr[1]=user.lName;
  tempArr[2]=user.email;
  tempArr[3]=user.age;
  table.push(tempArr);
  console.log('table'+JSON.stringify(table));
 });

在最后一个循环中,我期望table包含Tom、Pat和Sam的数组。然而,实际情况是这样的:
table[["Tom","Moody","Tom@example.com",30]]
table[["Pat","Smith","pat@example.com",32],["Pat","Smith","pat@example.com",32]]
table[["Sam","Dawn","sam@example.com",28],["Sam","Dawn","sam@example.com",28],["Sam","Dawn","sam@example.com",28]]
table[["Sam","Dawn","sam@example.com",28],["Sam","Dawn","sam@example.com",28],["Sam","Dawn","sam@example.com",28],["Sam","Dawn","sam@example.com",28]]

为什么 push() 会替换表格中的先前条目?非常感谢您的帮助。

4
tempArr从未改变,因此您一直在将相同的引用推入表格。将tempArr设为内部函数中的局部变量,以在forEach调用中使用。 - nolan
6个回答

6
其他人已经指出了您代码中的问题。
但是,您也使事情变得比必要的更加复杂。您只需执行以下操作即可:
```python #在需要使用时导入模块 import module #调用函数 module.function() ```
这样可以避免不必要的重复和冗余代码。

var data=[{"_id":"57b3e7ec9b209674f1459f36","fName":"Tom","lName":"Moody","email":"Tom@example.com","age":30},{"_id":"57b3e8079b209674f1459f37","fName":"Pat","lName":"Smith","email":"pat@example.com","age":32},{"_id":"57b3e8209b209674f1459f38","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28},{"_id":"57b3e8219b209674f1459f39","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28}];

var table = data.map(function(user) {
    return [
      user.fName,
      user.lName,
      user.email,
      user.age,
    ];
});
      
console.log(table);

如果您使用ES6:

var table = data.map(user => [ user.fName, user.lName, user.email, user.age ];

2

您不需要手动编写所有样板代码。使用适当的数组迭代器(在您的情况下是map)。

var table = data.map(function(user) {
   return [user.fName, user.lName, user.email, user.age];
});

1
显然,为了实现功能式方法,地图是必须的,但如果您喜欢命令式样式,则一个简单的方法是使用以下的for of循环。

var data = [{"_id":"57b3e7ec9b209674f1459f36","fName":"Tom","lName":"Moody","email":"Tom@example.com","age":30},{"_id":"57b3e8079b209674f1459f37","fName":"Pat","lName":"Smith","email":"pat@example.com","age":32},{"_id":"57b3e8209b209674f1459f38","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28},{"_id":"57b3e8219b209674f1459f39","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28}],
   table = [];
for (var user of data) table.push([user.fName,user.lName,user.email,user.age]);
console.log(table);


0

var data = [{"_id": "57b3e7ec9b209674f1459f36","fName": "Tom","lName": "Moody","email": "Tom@example.com","age": 30}, {"_id": "57b3e8079b209674f1459f37","fName": "Pat","lName": "Smith","email": "pat@example.com","age": 32}, {"_id": "57b3e8209b209674f1459f38","fName": "Sam","lName": "Dawn","email": "sam@example.com","age": 28}, {"_id": "57b3e8219b209674f1459f39","fName": "Sam","lName": "Dawn","email": "sam@example.com","age": 28}],
    table = [];

data.forEach(function(user) {
    table.push([user.fName, user.lName, user.email, user.age]);
});

console.log(table);


0

这里的问题不在于push。在Javascript中,变量存储对数组的引用。而在表格中,您正在将引用推入到同一个数组tempArr中。在推送之前,您需要创建新的数组或创建数组的深拷贝。

例如

var data=[{"_id":"57b3e7ec9b209674f1459f36","fName":"Tom","lName":"Moody","email":"Tom@example.com","age":30},{"_id":"57b3e8079b209674f1459f37","fName":"Pat","lName":"Smith","email":"pat@example.com","age":32},{"_id":"57b3e8209b209674f1459f38","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28},{"_id":"57b3e8219b209674f1459f39","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28}]
var table=[];
var dataArr = Object.keys(data).map(function(k) { return data[k] });
dataArr.forEach(function(user) {

  var tempArr=[];
  tempArr[0]=user.fName;
  tempArr[1]=user.lName;
  tempArr[2]=user.email;
  tempArr[3]=user.age;
  table.push(tempArr);
  console.log('table'+JSON.stringify(table));
 });

0

与许多其他编程语言不同,JavaScript 通过引用传递所有内容。这意味着当你执行 table.push(tempArr); 时,你实际上并没有推送 tempArr,而是推送了对 tempArr引用。因此,如果你这样做:

var a = 'a';

var table = [];
table.push(a);
a = 'b';
console.log(table[0]);

你将会得到输出 b。你需要做的是定义一个新变量来进行push操作,就像这样:

var data=[{"_id":"57b3e7ec9b209674f1459f36","fName":"Tom","lName":"Moody","email":"Tom@example.com","age":30},{"_id":"57b3e8079b209674f1459f37","fName":"Pat","lName":"Smith","email":"pat@example.com","age":32},{"_id":"57b3e8209b209674f1459f38","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28},{"_id":"57b3e8219b209674f1459f39","fName":"Sam","lName":"Dawn","email":"sam@example.com","age":28}]

var table=[];
var dataArr = Object.keys(data).map(function(k) { return data[k] });
dataArr.forEach(function(user) {
    var tempArr=[];
    tempArr[0]=user.fName;
    tempArr[1]=user.lName;
    tempArr[2]=user.email;
    tempArr[3]=user.age;
    table.push(tempArr);
 });

 console.log('table'+JSON.stringify(table));

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