Javascript 数组推送行为

Javascript 数组推送行为,javascript,arrays,Javascript,Arrays,虽然我有一些基本的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},{

虽然我有一些基本的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));
 });
在最后一个循环中,我希望表包含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()要替换表中的上一个条目?任何帮助都将不胜感激。

这里的问题不是推送。数组的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));
 });

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

变量a='a'

var table = [];
table.push(a);
a = 'b';
console.log(table[0]);
您将获得
b
作为输出。您要做的是定义一个新的变量来推送,如下所示

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

您不需要手工编写所有样板代码。使用适当的数组迭代器(
map


其他人已经指出了代码中的问题

然而,你也使事情变得比必要的更复杂。您可以这样做:

var data=[{“\u id”:“57b3e7ec9b209674f1459f36”,“fName”:“Tom”,“lName”:“Moody”,“email”:Tom@example.com,“年龄”:30},{“_id”:“57b3e8079b209674f1459f37”,“fName”:“Pat”,“lName”:“Smith”,“email”:pat@example.com,“年龄”:32},{“_id”:“57b3e8209b209674f1459f38”,“fName”:“Sam”,“lName”:“Dawn”,“email”:sam@example.com“,“年龄”:28},{U id:“57b3e8219b209674f1459f39”,“fName”:“Sam”,“lName”:“Dawn”,“email”:sam@example.com“,“年龄”:28}];
var table=data.map(函数(用户){
返回[
user.fName,
user.lName,
user.email,
user.age,
];
});

console.log(table);
显然,为了实现功能性方法,map是一种可行的方法。但是,如果您喜欢命令式样式,一种简单的方法可以是使用
来实现
循环,如下所示

var data=[{“\u id”:“57b3e7ec9b209674f1459f36”,“fName”:“Tom”,“lName”:“Moody”,“email”:Tom@example.com,“年龄”:30},{“_id”:“57b3e8079b209674f1459f37”,“fName”:“Pat”,“lName”:“Smith”,“email”:pat@example.com,“年龄”:32},{“_id”:“57b3e8209b209674f1459f38”,“fName”:“Sam”,“lName”:“Dawn”,“email”:sam@example.com“,”年龄“:28},{”身份证“:”57b3e8219b209674f1459f39,“fName”:“Sam”,“lName”:“Dawn”,“email”:sam@example.com“,“年龄”:28}],
表=[];
for(数据的var用户)table.push([user.fName,user.lName,user.email,user.age]);
控制台日志(表)
var data=[{“\u id”:“57b3e7ec9b209674f1459f36”,“fName”:“Tom”,“lName”:“Moody”,“email”:Tom@example.com,“年龄”:30},{“_id”:“57b3e8079b209674f1459f37”,“fName”:“Pat”,“lName”:“Smith”,“email”:pat@example.com,“年龄”:32},{“_id”:“57b3e8209b209674f1459f38”,“fName”:“Sam”,“lName”:“Dawn”,“email”:sam@example.com“,“年龄”:28},{u id”:“57b3e8219b209674f1459f39”,“fName:“Sam”,“lName:“Dawn”,“email:”sam@example.com“,“年龄”:28}],
表=[];
data.forEach(函数(用户){
table.push([user.fName,user.lName,user.email,user.age]);
});

console.log(table);
tempArr永远不会更改,因此您会一直将相同的引用推送到表上。将tempArr设置为forEach调用中内部函数的本地。
var table = data.map(function(user) {
   return [user.fName, user.lName, user.email, user.age];
});