【问题标题】:Calling function recursively in AngularJS在AngularJS中递归调用函数
【发布时间】:2016-09-20 10:09:02
【问题描述】:

我正在尝试递归调用函数(出于排序目的),但出现错误。我试图寻找解决方案,发现How to call function recursively; 我相应地更改了我的代码,所以现在它看起来像这样:

$scope.orderCustom = function() {

    qS.quickSort($scope.mydata, 0, mydata.length-1);
};

var qS = {
    quickSort: function quickSort(data, min, max) {

        if (min < max) {
            var p = qSP.quickSortPartition(data, min, max);
            var newMax = p-1;
            var newMin = p+1;

            qS.quicksort(data, min, newMax);
            qS.quicksort(data, newMin, max);
        }
    }
};

var qSP = {
    quickSortPartition: function quickSortPartition(data, min, max) {

        var pivot = data[max].id;
        var i = min;
        for (var j = min; j <= max; j++) {
            if (data[j].id <= pivot) {
                var pom = data[j];
                data[j] = data[i];
                data[i] = pom;
                i = i+1;
            }
        }  
        var pom = data[i];
        data[i] = data[max];
        data[max] = pom;    

        return i;
    }
};

我收到一个错误“错误:qS.quicksort 不是函数”。有谁知道如何解决这个问题? 我仍然无法对 stackoverflow 发表评论,因此我不得不为此提出一个新问题。任何帮助都将不胜感激。谢谢:)

【问题讨论】:

  • 拨打quickSort

标签: angularjs


【解决方案1】:

最简单的方法是去掉额外的包装,只使用函数:

$scope.orderCustom = function() {

    quickSort($scope.mydata, 0, mydata.length-1);
};

function quickSort(data, min, max) {

        if (min < max) {
            var p = quickSortPartition(data, min, max);
            var newMax = p-1;
            var newMin = p+1;

            quickSort(data, min, newMax);
            quickSort(data, newMin, max);
        }
}

function quickSortPartition(data, min, max) {

        var pivot = data[max].id;
        var i = min;
        for (var j = min; j <= max; j++) {
            if (data[j].id <= pivot) {
                var pom = data[j];
                data[j] = data[i];
                data[i] = pom;
                i = i+1;
            }
        }  
        var pom = data[i];
        data[i] = data[max];
        data[max] = pom;    

        return i;
}

请注意,您还必须更正递归调用 quickSort 的拼写,因为您使用了所有小写字母 quicksort

我认为这只是一个编程练习,因为对于实际代码,您最好使用内置的 sort() 函数,或者对于 Angular,您可能更喜欢 orderBy 过滤器。

例如,这与您尝试做的一样:

function compare(a,b) {
  if (a.id < b.id)
    return -1;
  if (a.id > b.id)
    return 1;
  return 0;
}

$scope.mydata.sort(compare);

【讨论】:

  • 啊啊啊,真是个愚蠢的错误。当然,事情是在一个错字,快速排序而不是快速排序。不错的收获。当然,它现在可以工作,无需包装(正如我最初写的那样)。非常感谢,谁知道多久会烦我:)
  • 顺便说一句,我不能在这里使用 orderBy,这就是我自己编写排序的原因(参见stackoverflow.com/questions/39572744/…
  • @ljerka,您应该可以使用比较功能调用 sort,请参阅我的帖子的编辑。
  • 对不起,如果这是一个愚蠢的问题,我对这些东西很陌生......但是如果我写 $scope.mydata.sort(compare),compare(a, b) "怎么知道“我的 a & b 是什么?顺便说一句,我要排序的是一个具有来自另一个集合的 id 的集合,我想按另一个集合的 name 属性对其进行排序。所以不是比较2个id-s那么简单
  • ab 是排序函数想要比较的值,因此数组的元素被排序。如果我理解你,你真的想比较 othercollection[a.id].someattribute &lt; othercollection[b.id].someattribute 吗?它使比较功能更长,但难度不大。
【解决方案2】:

您无需提及qS

只需quicksort 而不是qS.quicksort

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 1970-01-01
    • 2022-11-30
    • 2012-08-29
    • 2012-05-15
    • 1970-01-01
    • 2016-01-18
    • 2023-04-04
    相关资源
    最近更新 更多