Сортировка объектов по определенному правилу - PullRequest
8 голосов
/ 29 декабря 2011

В Javascript мне нужно упорядочить объекты в массиве в соответствии с типом. Каждый тип имеет более высокий приоритет, поэтому объект с типом «wipe» должен иметь наивысший приоритет, поэтому он должен находиться в начале массива (index = 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?
}

Ответы [ 3 ]

16 голосов
/ 29 декабря 2011

Это может быть решение, которое вы ищете:

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

Работает именно так, как запрошено. См. этот jsfiddle для доказательства.

В решении используется метод sort() класса Array, передавая ему обратный вызов, что позволяет проводить пользовательское сравнение. В этом случае сравнение основано на положении свойства .type сравниваемых элементов в массиве order.

4 голосов
/ 29 декабря 2011

Это довольно просто в 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).Это позволит отсортировать объекты в вашем массиве.Если вам нужен более подробный пример с использованием ваших конкретных данных, просто спросите.

3 голосов
/ 29 декабря 2011

JavaScript array.sort метод ожидает функцию сравнения, просто передайте эту функцию:

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