【问题标题】:Error returning an Object返回对象时出错
【发布时间】:2014-04-16 19:14:52
【问题描述】:
我有一个名为 ENTITIES 的对象数组以及接收字符串 id 和整个对象数组的以下函数:
function getEntityById(id, ENTITIES) {
id = id.toString(); //确保id是字符串
ENTITIES.forEach(function(ENT) {
if( ENT.name == id ) {
return( ENT );
}
});
}
我已经用 console.log 检查了这个函数,它工作正常。 (检查 id 并且 'if' 变为 TRUE)。当我尝试在函数外部访问返回的对象“ENT”时会出现问题,如下所示:
var entity0 = getEntityById('test', ENTITIES);
console.log(entity0.id);
我收到以下错误:Uncaught TypeError: Cannot read property 'id' of undefined
就像 getEntityById 函数从来没有真正返回过一个对象。
你们能帮帮我吗?有什么线索吗?
【问题讨论】:
标签:
javascript
function
object
【解决方案1】:
你有这个功能:
function getEntityById( id, ENTITIES) {
id = id.toString(); //made sure id is string
ENTITIES.forEach(
然后你就有了这个功能
function( ENT ) {
if( ENT.name == id ) {
return( ENT );
}
返回到你原来的函数:
});
}
它不做任何事情,所以getEntityById 什么也不返回......所以你得到了未定义。
你可以做的是:
function getEntityById( id, ENTITIES) {
id = id.toString(); //made sure id is string
var return_ENT;
ENTITIES.forEach(function( ENT ) {
if( ENT.name == id ) {
return_ENT = ENT;
}
});
return return_ENT;
}
更好的选择可能是使用过滤器:
function getEntityById( id, ENTITIES) {
id = id.toString(); //made sure id is string
return ENTITIES.filter(function(ent) { return ent.name == id})[0];
};
【解决方案2】:
如果你想返回找到的实体你必须保存它,退出forEach循环并返回变量:
function getEntityById(id, ENTITIES) {
var result = null;
id = id.toString(); //made sure id is string
ENTITIES.forEach(function( ENT ) {
if( ENT.name == id ) {
result = ENT;
}
});
return result;
}
但在这种情况下,您将做一些多余的工作(如果找到所需的实体 - 无需继续循环)。所以我建议这样做:
function getEntityById(id, ENTITIES) {
var i = ENTITIES.length;
while(--i >= 0) {
if (ENTITIES[i].id === id) {
return ENTITIES[i];
}
}
}