如何使用javascript将对象添加到数组中?
我在app.js文件中有一个数组,如下所示:如何使用javascript将对象添加到数组中?,javascript,arrays,node.js,Javascript,Arrays,Node.js,我在app.js文件中有一个数组,如下所示: var data = [ {id:1, firstName: 'John', lastName: 'Smith'}, {id:2, firstName: 'Jane', lastName: 'Smith'}, {id:3, firstName: 'John', lastName: 'Doe'} ]; 现在,我正在使用No
var data = [
{id:1, firstName: 'John', lastName: 'Smith'},
{id:2, firstName: 'Jane', lastName: 'Smith'},
{id:3, firstName: 'John', lastName: 'Doe'}
];
现在,我正在使用Node.js并尝试在module.js文件中创建函数调用addEmployee()。addEmplyee()只接受两个参数,即要添加的名字和姓氏。应使用下划线.js将id值计算为比当前最大id多一个。
这是我在module.js文件中的代码,但它不起作用
var _ = require('underscore');
module.exports = {
addEmployee: function (firstName, lastName) {
function Person(id, firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.id = function (data) {
var id = _.max(data, function (data) {
return data.id;
});
return id.id + 1;
}
var person = new Person(id, firstName, lastName);
data.push(person);
return data;
}
}
}
有人能帮忙吗?提前非常感谢 试试这个:
var _ = require('underscore');
module.exports = {
addEmployee: function (firstName, lastName) {
function Person(id, firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.id = (function (data) {
var id = _.max(data, function (data) {
return data.id;
});
return id.id + 1;
})(); //IIFE to invoke function immidiately and thus assign value to id
data.push({id: this.id,firstName: this.firstName,lastName: this.lastName});
return data;
}
}
}
应该是这样的:
var _ = require('underscore');
// import data
module.exports = {
addEmployee: function (firstName, lastName) {
// remove id
function Person(firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.id = (function (data) {
var id = _.max(data, function (data) {
return data.id;
});
return id.id + 1;
})();
}
// put OUTSIDE - dont need id here
var person = new Person(firstName, lastName);
data.push(person);
return data;
}
}
首先,无论如何您都不会调用这个内部函数/contstructor,因此它不会添加到数组中。其次,不要在函数中定义
Person
(每次调用都会将其定义为新事物-每个新的Person
都是新类型)。第三件事是,如果你调用你的代码,它会导致无限循环(比如在构造函数中调用新的self,在下一个新实例中也会这样做,以此类推)。此外,您在哪里定义/导入数据
var _ = require('underscore');
// probably it'd be even better to move this to separate module
function Person(id, firstName, lastName) {
this.firstName = firstName;
this.lastName = lastName;
this.id = id;
};
module.exports = {
addEmployee: function (firstName, lastName) {
data.push(new Person((_.max(data, function (data) {
return data.id;
}) + 1), firstName, lastName));
}
}
我还建议使用lodash
而不是undescore
(插入替换项,但编写得更好)
如果只需要对象来保存数据
{id,firstName,lastName}
,则不需要新类型Person
:
module.exports = {
addEmployee: function (firstName, lastName) {
var id = (_.max(data, function (data) {
return data.id;
}) + 1);
data.push({ id: id, firstName: firstName, lastName: lastName });
}
}
如果您使用node 6.X或4.X+(不确定es6表示法是否适用于所有4.X,肯定4.4+会这样做)和“use strict”代码>可以更短:
'use strict';
var _ = require('underscore');
module.exports = {
addEmployee: function (firstName, lastName) {
var id = (_.max(data, function (data) {
return data.id;
}) + 1);
data.push({ id, firstName, lastName });
}
}
最后,我建议不要对数据进行变异(副作用主要是坏的)——我会将其转换为类似的形式(假设节点可以执行es6):
@卢帕图斯:不完全是递归的,我使用了错误的措辞。但当op再次为person创建对象时,当再次调用函数时,它将创建对象,对吗?您好@A.J非常感谢!然而,我没有定义。也许,我没解释清楚。我的数据变量位于另一个名为app.js的js文件中。我应该先将此数据导入module.js吗?如果是,如何在node.js中执行此操作?非常感谢。你好@Daniel Tran,非常感谢!但是,我得到了一个错误:var person=newperson(id,firstName,lastName);^参考错误:id没有定义,可能我解释得不太清楚。我的数据变量位于另一个名为app.js的js文件中。我应该先将此数据导入module.js吗?如果是,如何在node.js中执行此操作?非常感谢。您好@Iupatus,非常感谢您的全面解释!很抱歉,我是node.js的新手,所以有些部分我仍然感到困惑。我仍在努力理解你的答案,很快会给你反馈。
'use strict';
const _ = require('underscore');
module.exports = {
// note that data comes as input
addEmployee: function (data, firstName, lastName) {
// obtain next id
const id = (_.max(data, function (data) {
return data.id;
}) + 1);
// return new data (old data + new object, but without mutation of initial object)
return [...data, { id, firstName, lastName }];
}
}