Lucee array.each返回值

时间:2015-03-02 17:21:28

标签: cfml lucee

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是如何工作的?

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

3 个答案:

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