2011-12-29 91 views
8

在Javascript中,我需要根据类型对数组中的对象进行排序。每种类型都具有更高的优先级,因此具有“擦除”类型的对象应具有最高优先级,因此应位于数组的前部(索引= 0)。根据特定规则对对象进行排序

排序这些对象的最佳方法是什么?有内建功能可以做到这一点吗?

对于如:

function sortObjects(objs) 
{ 
    // objs is an unsorted array of objects 
    var animPriority = {"wipe": 1, "fly": 2, "iris": 3, "flip": 4, "cube": 5, "blur": 6, "zoom": 7, "fade": 8, "glow": 9, "rotate": 10}; 

    for (var i=0; i<objs.length; i++) 
     if (objs[i].type == "wipe") 
      // bubblesort/bubbleswap element in objs[0] with objs[i]???? 
      // a bubble sort doesn't seem efficient though? 
} 
+0

只需将一个比较器函数传递给本地'.sort'函数即可。 – 2011-12-29 01:47:29

+1

谁会想到这样一个简单的问题就会产生这样的讨论,以及一系列半开机启动的答案! :) – Paul 2011-12-29 02:06:34

回答

3

JavaScript的array.sort方法需要一个比较功能,只需通过该功能:

function compareFunc(a,b) { return animPriority[a.type] - animPriority[b.type]; } 
16

这可能是你正在寻找的解决方案:

objs.sort(function(a,b){ 
    var order = ["wipe", "fly", "iris", "flip", "cube", 
     "blur", "zoom", "fade", "glow", "rotate"]; 
    return order.indexOf(a.type) - order.indexOf(b.type); 
}); 

它完全按照要求工作。请参阅this jsfiddle以获取证明。

该解决方案使用sort()方法Array类,将回调传递给它,它允许自定义比较。在这种情况下,比较是基于order阵列中.type属性的比较元素的位置。

+0

+1这里最好,最全面的答案。 – zizozu 2011-12-29 02:15:51

+1

创建这样的功能会更好吗? 'var myFunc = function(a,b){// function body};'?不会每次调用函数和数组时重新创建使用您的示例进行排序? – Paul 2011-12-29 02:16:42

+1

@保罗:没有冒犯,但考虑一下:)这一切都取决于你如何使用它,你的问题的答案更复杂。这里的重要问题是:1)关闭(可以访问'myFunc' /匿名函数),2)'objs'数组将被排序多少次,3)你关心命名空间污染。取决于如何将功能分配给'myFunc',答案是不同的。 – Tadeck 2011-12-29 02:26:10

3

在JavaScript中它非常简单:

首先,将您的对象放入数组中,例如, myArray

接下来,编写一个函数,该函数接受对象并返回小于0的值,如果第一个对象应该出现在数组中的第二个对象之前,则为0;如果这两个对象在排序上相同,如果第二个对象应该出现在数组中的第一个对象之前,那么它的值就是0例如:

function myOrderFunc(a, b) 
{ 
    // if a should come before b, return a negative value 
    // if b should come before a, return a positive value 
    // if they are equally ranked in the sort order, return 0 
} 

最后,请致电myArray.sort(myOrderFunc)。这将排序数组中的对象。如果你需要一个更具体的例子来使用你的特定数据,那就问问。

相关问题