2012-12-11 45 views
1

我有一个对象数组,我想使用.sort()函数进行排序。它应该按三个值排序(首先是第一个值,然后是第二个,最后是第三个值)。 我试过类似下面的东西,但它似乎不能正常工作。Javascript:通过三个值排序对象数组

myArray.sort(function(a,b) { 
    if (a.Value1 === b.Value1) { 
     if (a.Value2 === b.Value2) { 
      return (a.Value3 < b.Value3) ? -1 : (a.Value3 > b.Value3) ? 1 : 0; 
     } else { 
      return (a.Value2 < b.Value2) ? -1 : 1; 
     } 
    } else { 
     if (a.Value2 === b.Value2) { 
      return(a.Value1 < b.Value1) ? -1 : 1; 
     } else { 
      return (a.Value2 < b.Value2) ? -1 : 1; 
     } 
    } 
}); 

任何帮助将不胜感激。

+0

为什么在'else'语句中检查'Value2'?如果'Value1'已经不同,'Value2'不会影响订单。 – Amberlamps

回答

1

它大多是好的,但你搞砸在平凡的情况下的逻辑a.Value1 !== b.Value1

这里有一个固定的版本:

myArray.sort(function(a,b) { 
    if (a.Value1 === b.Value1) { 
     if (a.Value2 === b.Value2) { 
      return (a.Value3 < b.Value3) ? -1 : (a.Value3 > b.Value3) ? 1 : 0; 
     } else { 
      return (a.Value2 < b.Value2) ? -1 : 1; 
     } 
    } else { 
      return (a.Value1 < b.Value1) ? -1 : 1; 
    } 
}); 

Demonstration

+0

完美,非常感谢。 – Fantaftw

0
myArray.sort(function(a,b) { 

    function getResult(first, second) { 
     return (first < second) ? -1 : (first > second) ? 1 : 0; 
    } 

    if (a.Value1 !== b.Value1) return getResult(a.Value1, b.Value1); 
    if (a.Value2 !== b.Value2) return getResult(a.Value2, b.Value2); 
    return getResult(a.Value3, b.Value3); 

}); 
1

为什么这么复杂?试试这个:

myArray.sort(function(a,b) { 
    if(a.Value1 !== b.Value1) return (a.Value1 < b.Value1) ? -1 : 1; 
    if(a.Value2 !== b.Value2) return (a.Value2 < b.Value2) ? -1 : 1; 
    return (a.Value3 < b.Value3) ? -1 : 1; 
    }); 
0

对我来说这是更高效和可读的。另一方面,它适用于任何数量的字段

 List.sort(function (a, b) { 
      var keyA = a.Field1; 
      var keyB = b.Field1; 

      if (keyA > keyB) return -1; 
      if (keyA < keyB) return 1; 

      keyA = a.Field2; 
      keyB = b.Field2; 

      if (keyA > keyB) return -1; 
      if (keyA < keyB) return 1; 

      keyA = a.Field3; 
      keyB = b.Field3; 

      if (keyA > keyB) return -1; 
      if (keyA < keyB) return 1; 

      //You can repeat this for any number of fields 

      return 0; 
     }); 
相关问题