Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vue.js/6.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 forEach和对象构造函数_Javascript_Object - Fatal编程技术网

Javascript forEach和对象构造函数

Javascript forEach和对象构造函数,javascript,object,Javascript,Object,我有以下代码,它接受一个对象数组并使用构造函数创建新对象 为了避免逐个创建实例,我尝试使用数组上的forEach方法创建它们 我遇到的问题是,当我尝试记录结果时,构造函数创建的对象返回为“未定义” 我认为这是因为对象的作用域在forEach回调的内部,在外部是不可访问的 有没有办法访问我创建的对象 如果没有,请任何人向我建议,如果有更好的方法,我可以结构我的代码,以实现相同的结果 // Array of 'Person' objects let persons = [ {

我有以下代码,它接受一个对象数组并使用构造函数创建新对象

为了避免逐个创建实例,我尝试使用数组上的forEach方法创建它们

我遇到的问题是,当我尝试记录结果时,构造函数创建的对象返回为“未定义”

我认为这是因为对象的作用域在forEach回调的内部,在外部是不可访问的

有没有办法访问我创建的对象

如果没有,请任何人向我建议,如果有更好的方法,我可以结构我的代码,以实现相同的结果

// Array of 'Person' objects

let persons = [
    {
        name: "A",
        number: "000-1111-1111",
        location: "London"
    },
    {
        name: "B",
        number: "000-2222-2222",
        location: "Leeds"
    },
    {
        name: "C",
        number: "000-333-3333",
        location: "London"
    }
];


// Persons constructor

Person = function(name, number) {
    this.name = name;
    this.number = number;
};


// For each obj in array create a new constructor

persons.forEach(item => {
    if (item.location === "London") {
        let person = item.name;
        person = new Person(item.name, item.number);
        console.log(person);
    }
});


// Console log out new object for 'A'

console.log( Person )
console.log( A );

据我所知,问题是您需要一个全局变量,该变量的名称是动态字符串。在这种情况下,假设您希望在全局范围内访问,则可以使用窗口对象:

let persons = [
    {
        name: "A",
        number: "000-1111-1111",
        location: "London"
    },
    {
        name: "B",
        number: "000-2222-2222",
        location: "Leeds"
    },
    {
        name: "C",
        number: "000-333-3333",
        location: "London"
    }
];


// Persons constructor

Person = function(name, number) {
    this.name = name;
    this.number = number;
};


// For each obj in array create a new constructor

persons.forEach(item => {
    if (item.location === "London") {
        window[item.name] = new Person(item.name, item.number);
    }
});


// Console log out new object for 'A'

console.log( Person )
console.log( A );
如果您想要的是包含构造的
Person
对象的新数组,则可以使用
.map()
。您还需要使用
.filter()
,以便根据您的“伦敦”条件将结果限制为适当的元素:

let people = persons.filter(item => item.location === "London")
    .map(item => new Person(item.name, item.number));

请注意,您确实应该使用
let
var
const
声明
Person
变量;编写时,您的代码将创建一个隐式全局变量。

使用
.map()
而不是
.forEach()
,返回每个构造的Person,您将得到一个新数组。编辑实际上使用
.filter()
只获取伦敦人,然后使用
.map()
人已经是一个对象或人的数组:/谢谢!你是对的,这就是我试图实现的——使新创建的person对象在forEach之外(以及全局)可用。谢谢大家的回答!