递归函数返回JavaScript中的空列表

时间:2017-10-17 04:50:22

标签: javascript loops recursion

function getLineItemList(quotationItemElements, checkedLineItemIds) {
var lineItemList = [];
quotationItemElements.children.forEach(function (quotElement, index) {
    if(!parseBoolean(quotElement.isGroup)){
        checkedLineItemIds.forEach(function (checkedId, index) {
            if(quotElement.id == checkedId){
                lineItemList.push(quotElement);
            }
        });
    }else {
        if(quotElement.children.length > 0){
            getLineItemList(quotElement, checkedLineItemIds);
        }
    }
});
return lineItemList;
}
function parseBoolean(str) {
  return /true/i.test(str);
}

我在JavaScript列表的不同级别有相同的数据层次结构,而不是显式循环任何级别我正在使用递归调用(幸运的是工作正常)但函数总是返回空列表。

JSON Data

2 个答案:

答案 0 :(得分:2)

您没有捕获递归调用的返回值:

    if(quotElement.children.length > 0){
      /* nobody capture this */  getLineItemList(quotElement, checkedLineItemIds);
    }

你应该和lineItemList联系。因此,lineItemList保持其声明的方式,这是一个空数组。也许不是如果quotElement.isGroup中至少有一个返回true,但没有任何样本输入,我们就不知道了。

答案 1 :(得分:1)

您在函数内部定义lineItemList,这意味着每次调用函数时都会以空数组开始。您需要将数组作为参数传递给函数,并且还需要return getLineItemList函数的结果。

试试这个:

function getLineItemList(quotationItemElements, checkedLineItemIds, lineItemList) {
    var lineItemList = lineItemList || [];
    quotationItemElements.children.forEach(function (quotElement, index) {
        if(!parseBoolean(quotElement.isGroup)){
            checkedLineItemIds.forEach(function (checkedId, index) {
                if(quotElement.id == checkedId){
                    lineItemList.push(quotElement);
                }
            });
        }else {
            if(quotElement.children.length > 0){
                return getLineItemList(quotElement, checkedLineItemIds, lineItemList);
            }
        }
    });
    return lineItemList;
}