2013-11-28 4 views
0

Я пытаюсь сортировать многомерный массив в Javascript. Я вижу много объяснений, как сортировать по номерам, но я не могу понять, как сортировать его по тексту.Сортировка многомерного массива по тексту

массив, который я хочу разобраться, выглядит следующим образом:

var blocks = [ 
    { 
     "heading": ["2013-10-1", "Chris", "11"], 
     "content": "stuff 1" 
    }, 
    { 
     "heading": ["2013-10-3", "Zoe", "14"], 
     "content": "stuff 2" 
    }, 
    { 
     "heading": ["2013-10-2", "Petey", "12"], 
     "content": "stuff 3" 
    } 
] 

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

blocks.sort(
    function(a,b){ 
     return a.heading[2] - b.heading[2]; 
     } 
    ) 

Я не уверен, что функция, которую я передаю в метод сортировки, будет выглядеть, если бы я хотел отсортировать массив по первому или второму значению в массиве heading, так как значение в индексе 0 является датой и значением в индексе 1 является текст.

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

+0

Сортировка по тексту будет сортироваться в алфавитном порядке, ваша функция компаратора, которую вы передадите, будет выглядеть точно так же, как и для чисел. Какую ценность вы пытаетесь сортировать? Можете ли вы опубликовать код, который вы пробовали? –

+0

Я пытаюсь сортировать по второму значению массива заголовков, поэтому он должен сортировать значения «Крис», «Зоя» и «Пети». Код сортировки блоков - это код, который я пытался сортировать. Он работает для чисел (например, 3-е значение в массиве заголовков), просто не для текста. –

ответ

2

[Изменить] Следует отметить, что хотя начальное решение, которое я предлагал, работает, это нехорошее решение, потому что оно излишне сложное.

Оператор > может использоваться для вашей цели. При сравнении строк строка a считается меньше строки b, если строка a предшествует b в алфавитном порядке.

Единственный улов в том, что это чувствительно к регистру, и поэтому верхний регистр подходит к нижнему регистру, например. сортировка символов AaBbCc даст вам ABCabc.

Это означает, что вы можете просто сделать это:

blocks = blocks.sort(function(a,b) { return a.heading[1] > b.heading[1] } 

Предыдущий ответ:

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

Отметьте, что sort() сортирует по алфавиту. Итак, все, что нам нужно сделать, это заставить функцию sort() работать над именами людей.

blocks = blocks.sort(
    function(a,b){ 

     var x = [a.heading[1], b.heading[1]].sort() 

     if (x[0] == a.heading[1]) {return -1} else 
     {return 1}; 
     } 
    ) 
1

попробовать что-то вроде этого:

blocks.sort(function(a, b){ 
    if(a.heading[0] < b.heading[0]) return -1; 
    if(a.heading[0] > a.heading[0]) return 1; 
    return 0; 
}); 

Или просто упростив код, указанный выше:

blocks.sort(function(a, b){ 
    if(a.heading[0] < b.heading[0]) { 
     return -1; 
    } else { 
     return 1; 
    } 
    return 0; 
}); 

Вы также можете использовать следующие:

blocks.sort(function(a, b){ 
    var heading_a = a.heading.toLowerCase(); 
    var heading_a=b.heading.toLowerCase(); 

    if (heading_a < heading_a) //sort ascending 
     return -1 
    if (heading_a > heading_a) 
     return 1 
    return 0 //just return default value indicating there is no sort 
}); 

Если данные содержат юникод строки, то вы должны использовать код выше:

blocks.sort(function(a, b){ 
    var heading_a = a.heading[0].toLowerCase(); 
    var heading_a=b.heading[0].toLowerCase(); 

    return heading_a.localeCompare(heading_b); 
}); 

Это просто пик подхалима в сортировке, это просто быстрый пример, и я надеюсь, что это поможет.

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