排序对象数组

时间:2017-04-27 09:28:02

标签: javascript arrays sorting typescript

我希望对一系列奖牌进行排序。我的第一个排序返回一个根据金牌排序的数组。然后我希望那些具有相同金币但是银牌不同(铜牌相同)。我使用以下代码实际上让我的内存耗尽。这是我的代码:

static sort(data) {
    let sorted = data.sort((a, b) => b.medal.gold - a.medal.gold);
    let next, temp, current;
    for (let i = 0; i < sorted.length; i++) {
        current = sorted[i].medal;
        if (sorted[i+1]) next = sorted[i+1].medal;
        if (next) {
            if (current.gold === next.gold) {
                if (current.silver < next.silver) {
                    temp = sorted[i+1];
                    sorted[i+1] = sorted[i];
                    sorted[i] = temp;
                }
                else if (current.silver === next.silver) {
                    if (current.bronze < next.bronze) {
                        temp = sorted[i+1];
                        sorted[i+1] = sorted[i];
                        sorted[i] = temp;
                    }
                }
            }
        }
    }
    return sorted;
}

2 个答案:

答案 0 :(得分:2)

您必须将 next 设置为null,因为它保留了上一次迭代的值,而if(next)始终为true。之后,该函数将始终创建一个元素并将其添加到数组中(排序[i + 1] = sorted [i]),直到内存不足为止。

这是一个有效的例子:

&#13;
&#13;
var rawData = 
    [{ id: 1, medal: {gold: 2, silver: 1, bronze: 1}}, 
     { id: 2, medal: {gold: 2, silver: 1, bronze: 2} }, 
     { id: 3, medal: {gold: 5, silver: 1, bronze: 4} } ];

function sortData(data) {
    let sorted = data.sort((a, b) => b.medal.gold - a.medal.gold);
    let next, temp, current;
    for (let i = 0; i < sorted.length; i++) {
        next = undefined;
        current = sorted[i].medal;
        if (sorted[i+1]) next = sorted[i+1].medal;
        if (next) {
            if (current.gold === next.gold) {
                if (current.silver < next.silver) {
                    temp = sorted[i+1];
                    sorted[i+1] = sorted[i];
                    sorted[i] = temp;
                }
                else if (current.silver === next.silver) {
                    if (current.bronze < next.bronze) {
                        temp = sorted[i+1];
                        sorted[i+1] = sorted[i];
                        sorted[i] = temp;
                    }
                }
            }
        }
    }
    return sorted;
};

console.log(sortData(rawData))
&#13;
&#13;
&#13;

请注意,在您使用奖牌而非奖牌的功能中,您在其中一条评论中提供了数据。

答案 1 :(得分:2)

您希望改进比较功能,以便满足这一要求:

data.sort((a, b) => (b.medal.gold - a.medal.gold) 
                 || (b.medal.silver - a.medal.silver) 
                 || (b.medal.bronze - a.medal.bronze) )

然后你根本不需要(无尽的)for循环。