我有一个名为ENTITIES的对象数组,以及接收和String 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);
我收到以下错误:未捕获的TypeError:无法读取属性' id'未定义的 它就像getEntityById函数从未真正返回过一个Object。
你能帮助我吗?有线索吗?答案 0 :(得分: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];
};
答案 1 :(得分:1)
如果要返回找到的实体,则必须保存它,退出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];
}
}
}