Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用javascript将对象添加到数组中?_Javascript_Arrays_Node.js - Fatal编程技术网

如何使用javascript将对象添加到数组中?

如何使用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

我在app.js文件中有一个数组,如下所示:

   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 }];
    }
}