2

在 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 的工作原理?

编辑:要清楚,第二个函数确实返回找到的对象。

4

3 回答 3

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

thengetLineItemDetailsById()没有返回任何东西,所以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何时满足退出标准。

于 2015-03-02T19:31:13.803 回答
0

如果 ID 始终存在,请使用:

public function getLineItemDetailsById(required numeric id){
    return this.LineArray.Find(function(i){return i.ID==id);});
}
于 2015-10-07T20:22:04.643 回答
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;   }
于 2016-07-21T13:36:42.547 回答