繁体   English   中英

Javascript排序数组对象未执行

[英]Javascript sort array of objects not executing

我必须对对象数组进行排序,并且已经编写了代码,但是它没有执行。 数组是相同的,当我在调试器控制台中查看时,它会跳到下一个函数,并且不执行我的排序。 我尝试了很多事情,但似乎没有任何效果。 也许我正在忽略某些东西,但我希望有人知道为什么它无法执行。

我的代码:

function orderData(toSort) {
    console.dir(toSort);
    toSort.sort(compareCountries);

    console.dir(toSort);
    return toSort;
}
function compareCountries(a, b) {
    var avgx = 0;
    var avgy = 0;

    avgx = calcAvgForAllProperties(a, avgx);
    avgy = calcAvgForAllProperties(b, avgy);

    a["overalAvg"] = avgx;
    b["overalAvg"] = avgy;

    if (a.overalAvg > b.overalAvg)
        return -1;
    else if (b.overalAvg < a.overalAvg)
        return 1;
    else
        return 0;
}

要么:

function orderData(toSort) {
    console.dir(toSort);
    toSort.sort(function (a, b) {
        var avgx = 0;
        var avgy = 0;

        avgx = calcAvgForAllProperties(a, avgx);
        avgy = calcAvgForAllProperties(b, avgy);

        a["overalAvg"] = avgx;
        b["overalAvg"] = avgy;

        if (a.overalAvg > b.overalAvg)
            return -1;
        else if (b.overalAvg < a.overalAvg)
            return 1;
        else
            return 0;
    });

    console.dir(toSort);
    return toSort;
}

//编辑这是我的数据示例:

资料范例

您的代码有几个问题:

  1. 排序功能有副作用

你不应该计算overallAvgcompareCountries 相反,您应该在排序之前执行此操作。

    var countries = [ /* your countries */ ];

    countries.forEach(calculateCountryOverallFooAverage); // Standard forEach is not chainable.
    countries.sort(compareCountriesByOverallFooAverage);

    function calculateCountryOverallFooAverage(country) {
        country.calculateOverallFooAverage();
    }

    function compareCountriesByOverallFooAverage(lhs, rhs) {
        var lhsAvg = lhs.overallFooAverage();
        var rhsAvg = rhs.overallFooAverage();

        if (lhsAvg < rhsAvg) { return -1; }
        else if(lhsAvg > rhsAvg) { return 1; }
        return 0;
    }
  1. 比较是不正确的,因为第二个测试与第一个测试相同( if (a < b) {} else if (b > a) {} else {} )。 它应该是:

     if (a.overalAvg > b.overalAvg) return -1; else if (a.overalAvg < b.overalAvg) return 1; else return 0; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM