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;   }