On Lucee 4.5.1.003我有这个函数,其中LineArray是一个LineItem对象数组。
public function getLineItemDetailsById(required numeric id){
this.LineArray.each(function(i){
if(i.Id == id){
return i;
}
});
}
即使匹配,该函数也会返回null。如果我添加一个var来保存找到的对象,则返回var。
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返回i或者我误解了array.each是如何工作的?
编辑:要清楚,第二个函数会返回找到的对象。
答案 0 :(得分:2)
您需要仔细查看第一个示例中的代码:
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()
“返回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
。
答案 1 :(得分:0)
如果始终存在ID,请使用:
public function getLineItemDetailsById(required numeric id){
return this.LineArray.Find(function(i){return i.ID==id);});
}
答案 2 :(得分:0)
.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; }