2016-06-23 6 views
1

у меня есть массив объектов, что-то вроде этогоСортировка Javascript массив несколькими ключами

var itemArray = [ 
    { 
     "name": "name1", 
     "flag": true, 
    }, 
    { 
     "name": "name1", 
     "flag": false, 
    }, 
    { 
     "name": "name2", 
     "flag": false, 
    }, 
    { 
     "name": "name3", 
     "flag": true, 
    }   
]; 

Я уже сортировочного это с помощью ключа имя с помощью следующего:

var sortedItems = sortByKey(itemArray, "name"); 

function sortByKey(array, key) { 
    return array.sort(function(a, b) { 
     var x = a[key]; 
     var y = b[key]; 
     return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
}); 

Как я также сортировать это по ключу флага в алфавитном порядке, чтобы ложные флаги отображались перед истинными флагами? (Я могу использовать строку вместо булева на свойстве флага, если это делает его проще)

Чтобы уточнить, что я ищу, это массив, который будет возвращен, как это, например:

[ 
    { name: "name_a", flag: false }, 
    { name: "name_a", flag: true }, 
    { name: "name_b", flag: false }, 
    { name: "name_b", flag: true}, 
    { name: "name_c", flag: true}, 
    { name: "name_d", flag: false}, 
] 
+2

Логик проста: в функции сравнения вы в первый раз первичное сравнения, если это * не равен *, вы возвращаете результат сравнения, в противном случае вы делаете свое второстепенное сравнение и возвращаете результат. – deceze

+0

Возможный дубликат [Javascript, как вы сортируете массив по нескольким столбцам?] (Http://stackoverflow.com/questions/2784230/javascript-how-do-you-sort-an-array-on-multiple-columns) – Kld

ответ

2

вар sortedItems = sortByKey (itemArray, "название");

function sortByKey(array, key) { 
    return array.sort(function(a, b) { 
     if(a[key] == b[key]) { 
      return (a['flag'] ? -1 : 1); 
     } else { 
      var x = a[key]; 
      var y = b[key]; 
      return x.localeCompare(y); 
     } 
}); 
+0

Да, похоже, ectly. Большое вам спасибо за то, что потратили свое драгоценное время, помогая мне Эдуарду, это искренне ценится. – user2928010

+0

было моим удовольствием: D –

1
var sortedItems = sortByKey(itemArray, "name"); 

    function sortByKey(array, key) { 
     return array.sort(function(a, b) { 
      if(a['flag'] == f['flag']) { 
       var x = a[key]; 
       var y = b[key]; 
       return ((x < y) ? -1 : ((x > y) ? 1 : 0)); 
      } else { 
       return (a['flag'] ? -1 : 1); 
      } 
    }); 
+0

С этим что-то не так. Он не полностью сортируется по имени. Некоторые из них не в алфавитном порядке. – user2928010

+0

change ((x y)? 1: 0)) to x.localeCompare (y) –

+0

Тем не менее, это возвращает список, в котором все элементы с истинным флагом находятся в алфавитном порядке по имени, а затем все элементы с ложными флагами, которые в алфавитном порядке по имени. Я ищу сортированный список, где весь список находится в алфавитном порядке по имени, а также флаги сортируются по алфавиту. например "{name:" name_a ", flag: false}, {name:" name_a ", flag: true}, {name:" name_b ", flag: false}, {name:" name_b ", flag: true} .. – user2928010

1

Вы можете использовать правильный обратный вызов, сортировать сначала по flag, и если он равен то name.

var itemArray = [{ "name": "name1", "flag": true, }, { "name": "name1", "flag": false, }, { "name": "name2", "flag": false, }, { "name": "name3", "flag": true, }]; 
 

 
itemArray.sort(function (a, b) { 
 
    return a.name.localeCompare(b.name) || a.flag - b.flag; 
 
}), 
 

 
console.log(itemArray);

+0

. Похоже, что только сортировка по клавише флага – user2928010

+0

почему вы так думаете? –

+0

Фактически, запуск фрагмента сортируется только по флагом, когда я запускаю его в своем коде, он сортируется только по имени, например, теперь у меня есть отсортированный массив, который содержит следующие данные: имя: флаг «some name»: true , имя: "some name" flag: false, имя: "some name" flag: true – user2928010

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