Javascript对对象数组进行排序未执行

标签 javascript arrays sorting

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

我的代码:

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

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

Data example

最佳答案

您的代码存在几个问题:

  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;
    }
  • 比较不正确,因为第二个测试与第一个测试等效(您执行 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;
    
  • 关于Javascript对对象数组进行排序未执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34961945/

    相关文章:

    javascript - 使用 Ajax 加载的动画内容

    javascript - W3C 通知范围

    javascript - 检测鼠标位置并触发功能

    java - 将行数据读取到字符串数组中?

    c - 在C中解析和拆分来自txt文件的字符串

    python - 重复字符的计数,包括字符串python中的非重复字符

    .net - 添加节点后自动对TreeView进行排序

    javascript - 在 JavaScript 中通过索引从对象数组中获取值?

    java - 将 for 循环的数组结果保存到变量

    c - 使用结构体和指针排序