Lucee array.each return 值
Lucee array.each return value
在 Lucee 4.5.1.003 上,我有这个函数,其中 LineArray 是 LineItem 对象的数组。
public function getLineItemDetailsById(required numeric id){
this.LineArray.each(function(i){
if(i.Id == id){
return i;
}
});
}
函数 return 即使有匹配项也是空的。如果我添加一个 var 来保存找到的对象,则 var 是 returned.
public function getLineItemDetailsById(required numeric id){
var found = '';
this.LineArray.each(function(i){
if(i.Id == id){
found = i;
//return i;
}
});
return found;
}
我期望 array.each 变成 return 是我做错了什么,还是我误解了 array.each 的工作原理?
编辑:为了清楚起见,第二个函数执行 return 找到的对象。
您需要仔细查看第一个示例中的代码:
public function getLineItemDetailsById(required numeric id){ // first function
this.LineArray.each(function(i){ // second function
if(i.Id == id){
return i; // return for second function
}
});
// no return from first function
}
为了说明你的问题,我稍微做了注释。 getLineItemDetailsById()
"returns null
" 因为你根本没有从它返回任何东西。所以如果你有:
result = getLineItemDetailsById(1);
然后 getLineItemDetailsById()
没有返回任何东西,所以 result
最终成为 null
。
这就是您遇到的问题。
此外,您不希望在该函数中使用 each()
:只有当您确定要遍历整个数组时才会使用 each()
。在您的情况下,您似乎想在找到 id
.
的匹配项后立即退出
在这种情况下你需要这样的东西:
public function getLineItemDetailsById(required numeric id){
var matchedElement = null;
this.LineArray.some(function(element){
if(element.Id == id){
matchedElement = element;
return true;
}
});
return matchedElement;
}
当一个人想要遍历一个数组时使用 some()
直到 一些条件被匹配。在这里,我利用它在满足退出条件时设置 matchedElement
。
如果 ID 始终存在,请使用:
public function getLineItemDetailsById(required numeric id){
return this.LineArray.Find(function(i){return i.ID==id);});
}
.each loops through the entire array and returns void
.reduce returns a single value after looping through all elements
.some allows an exit sooner than each
(更多方法见文档)
for(i in this.lineArray)if(i.id is id) return i; ... avoids some overhead
尽管在大多数情况下更好的方法是提前从 this.lineArray 填充 this.lineStruct。
this.lineStruct={};
this.lineArray.each(function(i){this.lineStruct[i.id]=i;});
function getLineById(id)
{ return this.lineStruct.keyexists(id)?this.lineStruct[id]:null; }
在 Lucee 4.5.1.003 上,我有这个函数,其中 LineArray 是 LineItem 对象的数组。
public function getLineItemDetailsById(required numeric id){
this.LineArray.each(function(i){
if(i.Id == id){
return i;
}
});
}
函数 return 即使有匹配项也是空的。如果我添加一个 var 来保存找到的对象,则 var 是 returned.
public function getLineItemDetailsById(required numeric id){
var found = '';
this.LineArray.each(function(i){
if(i.Id == id){
found = i;
//return i;
}
});
return found;
}
我期望 array.each 变成 return 是我做错了什么,还是我误解了 array.each 的工作原理?
编辑:为了清楚起见,第二个函数执行 return 找到的对象。
您需要仔细查看第一个示例中的代码:
public function getLineItemDetailsById(required numeric id){ // first function
this.LineArray.each(function(i){ // second function
if(i.Id == id){
return i; // return for second function
}
});
// no return from first function
}
为了说明你的问题,我稍微做了注释。 getLineItemDetailsById()
"returns null
" 因为你根本没有从它返回任何东西。所以如果你有:
result = getLineItemDetailsById(1);
然后 getLineItemDetailsById()
没有返回任何东西,所以 result
最终成为 null
。
这就是您遇到的问题。
此外,您不希望在该函数中使用 each()
:只有当您确定要遍历整个数组时才会使用 each()
。在您的情况下,您似乎想在找到 id
.
在这种情况下你需要这样的东西:
public function getLineItemDetailsById(required numeric id){
var matchedElement = null;
this.LineArray.some(function(element){
if(element.Id == id){
matchedElement = element;
return true;
}
});
return matchedElement;
}
当一个人想要遍历一个数组时使用 some()
直到 一些条件被匹配。在这里,我利用它在满足退出条件时设置 matchedElement
。
如果 ID 始终存在,请使用:
public function getLineItemDetailsById(required numeric id){
return this.LineArray.Find(function(i){return i.ID==id);});
}
.each loops through the entire array and returns void
.reduce returns a single value after looping through all elements
.some allows an exit sooner than each
(更多方法见文档)
for(i in this.lineArray)if(i.id is id) return i; ... avoids some overhead
尽管在大多数情况下更好的方法是提前从 this.lineArray 填充 this.lineStruct。
this.lineStruct={};
this.lineArray.each(function(i){this.lineStruct[i.id]=i;});
function getLineById(id)
{ return this.lineStruct.keyexists(id)?this.lineStruct[id]:null; }