forEach和object构造函数

时间:2018-04-16 15:42:14

标签: javascript object

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

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

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

我希望这是因为对象的范围在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 );

2 个答案:

答案 0 :(得分:2)

如果你想要的是包含构造的Person个对象的 new 数组,你可以使用.map()。您还希望使用.filter(),以便根据您的"伦敦"将结果限制为适当的元素。条件:

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

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

答案 1 :(得分:0)

根据我的理解,您遇到的问题是您希望拥有一个全局变量,该变量的名称是动态字符串。在这种情况下,假设您希望在全局范围内进行访问,则可以使用window对象:

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