我有以下代码,它接受一个对象数组并使用构造函数创建新对象。
为了避免逐个创建实例,我尝试使用数组上的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 );
答案 0 :(得分:2)
如果你想要的是包含构造的Person
个对象的 new 数组,你可以使用.map()
。您还希望使用.filter()
,以便根据您的"伦敦"将结果限制为适当的元素。条件:
let people = persons.filter(item => item.location === "London")
.map(item => new Person(item.name, item.number));
请注意,您确实应该使用Person
或let
或var
声明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 );