2016-11-11 2 views
3

У меня есть массив, который выглядит примерно так:Сортировка объектов в массиве по двум различным критериям

 var arr = [{user: '3', cash: 2}, 
     {user: 'tim', cash: 3}, 
     {user: '5', cash: 2}, 
     {user: 'noah', cash: 3}] 

сортировать его главных добытчиков, как это:

arr.sort(function (a, b) { 
    return b.tS - a.tS; 
}); 

Он отлично работает, но после того как я отсортировал ребята с самыми высокими деньгами, я хочу также сортировать все по алфавиту по полю пользователя. Имейте в виду, что некоторые пользователи могут иметь номера, но типа String (not Number).

Я не могу использовать библиотеки, и я бы предпочел, чтобы он работал как можно быстрее машинным способом.

+0

простой способ: разбирайтесь дважды, убедившись, что 2-го рода является стабильным. – dandavis

+0

Я получил его, чтобы работать благодаря Нине, но есть ли способ до \t , чтобы договориться об этом наличными, а затем по порядку, из-за чего они были изначально? (если noah является последним индексом с деньгами 3 и движется выше «3» с наличными деньгами 2, он должен быть ниже tim, который также с деньгами 3) – user1938653

+0

да, посмотрите «стабильный sort js»; это неинтуитивно просто. – dandavis

ответ

4

Вы можете связать критерии сортировки.

Цепочка работает для каждого шага, где первая дельта равна нулю. Затем вычисляется следующая дельта или функция сравнения, и раннее возвращается, если значение отличается от нуля.

Здесь только две группы сортировки - это возвращаемое значение, но для более длинных цепей выполняется следующее сравнение.

var arr = [{ user: '3', cash: 2 }, { user: 'tim', cash: 3 }, { user: '5', cash: 2 }, { user: 'noah', cash: 3 }]; 
 

 
arr.sort(function (a, b) { 
 
    return b.cash - a.cash || a.user.localeCompare(b.user); 
 
}); 
 

 
console.log(arr);
.as-console-wrapper { max-height: 100% !important; top: 0; }

Чтобы получить вид с индексом, необходимо хранить индекс во временном массиве и использовать sorting with map.

var array = [{ user: '3', cash: 2 }, { user: 'tim', cash: 3 }, { user: '5', cash: 2 }, { user: 'noah', cash: 3 }]; 
 

 
// temporary array holds objects with position and sort-value 
 
var mapped = array.map(function(el, i) { 
 
    return { index: i, cash: el.cash }; 
 
}); 
 

 
// sorting the mapped array containing the reduced values 
 
mapped.sort(function(a, b) { 
 
    return b.cash - a.cash || a.index - b.index; 
 
}); 
 

 
// container for the resulting order 
 
var result = mapped.map(function(el){ 
 
    return array[el.index]; 
 
}); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+0

Есть ли способ устроить их наличными, а затем по порядку, в котором они были изначально? (индексы) – user1938653

+0

да, но с сортировкой с картой. см. править. –

+0

Я получил его, чтобы работать, но есть ли более чистый и более короткий способ машинным способом? спасибо btw – user1938653

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