2013-02-14 8 views
7

Мне было интересно, как я могу сортировать массив по индивидуальному заказу, а не по алфавиту. Представьте, у вас есть этот массив/объект:Сортировка по специальному заказу

var somethingToSort = [{ 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "fruit", 
    name: "apple" 
}]; 

здесь мы имеем 3-х различных типов: фрукты, овощные и конфеты. Теперь я хочу отсортировать этот массив и убедиться, что все фрукты в первую очередь, конфеты приходят после фруктов, а овощи - в последний раз. Каждому типу необходимо, чтобы их элементы сортировались в алфавитном порядке. Мы будем использовать функцию, как sortArrayOnOrder (["fruit","candy","vegetable"], "name"); Так в принципе, вы бы в конечном итоге с этого массива после сортировки:

var somethingToSort = [{ 
    type: "fruit", 
    name: "apple" 
}, { 
    type: "fruit", 
    name: "banana" 
}, { 
    type: "fruit", 
    name: "strawberry" 
}, { 
    type: "candy", 
    name: "kitkat" 
}, { 
    type: "candy", 
    name: "twix" 
}, { 
    type: "vegetable", 
    name: "broccoli" 
}, { 
    type: "vegetable", 
    name: "carrot" 
}]; 

Любой идея, как создать сценарий для этого?

+0

Смотрите также многие другие «[как сортировать] (http://www.google.de/search?q=stackoverflow+javascript+sort+array+ из + объектов) "вопросы – Bergi

ответ

12

Улучшенная версия кода Cerbrus':

var ordering = {}, // map for efficient lookup of sortIndex 
    sortOrder = ['fruit','candy','vegetable']; 
for (var i=0; i<sortOrder.length; i++) 
    ordering[sortOrder[i]] = i; 

somethingToSort.sort(function(a, b) { 
    return (ordering[a.type] - ordering[b.type]) || a.name.localeCompare(b.name); 
}); 
+0

Хм, хорошая идея построить объект из sortOrder, устраняет необходимость использования 'indexOf' каждый раз при вызове функции. +1 – Cerbrus

+0

Удивительный. Это работает. Благодаря! – RemiDG

0

Array.sort принимает функцию сортировки, в которой вы можете применить пользовательскую логику сортировки.

2

Попробуйте это:

var sortOrder = ['fruit','candy','vegetable']; // Declare a array that defines the order of the elements to be sorted. 
somethingToSort.sort(
    function(a, b){        // Pass a function to the sort that takes 2 elements to compare 
     if(a.type == b.type){     // If the elements both have the same `type`, 
      return a.name.localeCompare(b.name); // Compare the elements by `name`. 
     }else{         // Otherwise, 
      return sortOrder.indexOf(a.type) - sortOrder.indexOf(b.type); // Substract indexes, If element `a` comes first in the array, the returned value will be negative, resulting in it being sorted before `b`, and vice versa. 
     } 
    } 
); 

Кроме того, ваше объявление объекта неверно. Вместо того, чтобы:

{ 
    type = "fruit", 
    name = "banana" 
}, // etc 

Использование:

{ 
    type: "fruit", 
    name: "banana" 
}, // etc 

Итак, замените = знаки с :-х гг.

+0

+1, хороший. См. Мой ответ для улучшенного варианта улучшения – Bergi

+0

Wups, извините за = вместо:. Просто написал пример здесь, ничего не копировал макароны и забыл о: присвоении значений. Im тоже использовал для использования оператора = для назначения значений haha: P – RemiDG

Смежные вопросы