2017-04-27 153 views
0

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

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

可以请您分享数组 – brk

+0

请更新您的阵列数据到您的问题中以获得更详细的信息。 –

+3

为什么你在javascript中使用'static'? –

回答

2

你必须设置下一个某处空,因为它使来自前一次迭代的值和如果(下一个)总是真。之后,函数将总是创建一个元素并将其添加到数组中(排序[i + 1] = sorted [i]),直到内存用完。

这里是一个工作示例:

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))

请注意,在函数您使用的奖牌而不是奖牌因为你已经在一个提供的数据你注释。

+0

确实。发现得好! – trincot

+0

太好了。但我也对上述代码不起作用感兴趣。 – franckstifler

+0

呃......它*被解释了。 – trincot

2

你想提高你的比较功能,因此,需要注意的是要求:

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

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