2013-08-20 2 views
3

Это то, как данные были предоставлены мне в объекте w/elements, разделенном символом pipe.Сочетание сортировки массивов Javascript. Получение непредсказуемых результатов

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

carriersOne = ['St. Joseph\'s Medical Center | New York Health Care Insurance Company | Some Other Company']; 
carriersTwo = ['Advantage Care | Chicago Insurance Company | Hospital Insurance Corporation']; 

carriersOne = carriersOne[0].split('|'); 
carriersTwo = carriersTwo[0].split('|'); 

allCarriers = carriersOne.concat(carriersTwo); 
allCarriers.sort(); 

count = allCarriers.length; 

for(i=0;i<count;i++) { 
alert(allCarriers[i]); 
} 

Что вы получаете:

Chicago Insurance Company 
    Hospital Insurance Corporation 
    New York Health Care Insurance Company 
Some Other Company 
Advantage Care 
St. Joseph's Medical Center 

ш-т-звуковым сигналом того, что? Примечание: если вы используете одиночные имена или предсказуемые имена и фамилии, он объединяется и сортируется в порядке.

+2

Порядок пространство предшествует А. – Paul

ответ

0

ASCII пространства является 32 и символов капитала начиная с 65 лет, и маленькие буквы из 97. Вот почему пространство сортируется до A и a.

Вы можете обрезать это, используя регулярные выражения или просто воспользовавшись underscore.js

5

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

// split on pipe and surrounding white space 
var splitRe = /\s*\|\s*/; 

carriersOne = carriersOne[0].split(splitRe); 
carriersTwo = carriersTwo[0].split(splitRe); 
1

Вам нужно обрезать пробелы:

carriersOne = carriersOne[0].split('|').map(function(e){return e.replace(/^\s*/, '')}); 
carriersTwo = carriersTwo[0].split('|').map(function(e){return e.replace(/^\s*/, '')}); 
+0

только ради него .. я бы обрезаны на пробельные с конца тоже .. например, «carrierOne [0] .split (« | »). map (function (e) {return e.replace (/^\ s * /, '') .replace (/ \ s * $ /, '') }); '. Я уверен, если есть лучший способ сделать это. @xdazz – Saurabh

0

Это пространства между трубами. Вот очень интересное (и более гибкое) решение.

http://jsfiddle.net/THEtheChad/3v7ss/

var carriersOne = ['St. Joseph\'s Medical Center | New York Health Care Insurance Company | Some Other Company']; 
var carriersTwo = ['Advantage Care | Chicago Insurance Company | Hospital Insurance Corporation']; 

var allCarriers = parseAndMerge(carriersOne, carriersTwo).sort(); 

var count = allCarriers.length; 

allCarriers.forEach(function(carrier){ 
    alert(carrier); 
}); 

function parseAndMerge(){ 
    var args = Array.prototype.slice.call(arguments) 
     , collector = [] 
    ;//var 

    args.forEach(function(arr){ 
     collector = collector.concat(arr[0].split('|').map(trim)); 
    }); 

    return collector; 
} 

function trim(string) { return string.trim() } 

Промежутки между ними трубы | вызывают ваш порядок сортировки некорректным. Попробуйте что-то вроде этого:

http://jsfiddle.net/THEtheChad/LQxW8/

carriersOne = ['St. Joseph\'s Medical Center | New York Health Care Insurance Company | Some Other Company']; 
carriersTwo = ['Advantage Care | Chicago Insurance Company | Hospital Insurance Corporation']; 

carriersOne = normalize(carriersOne); 
carriersTwo = normalize(carriersTwo); 

allCarriers = carriersOne.concat(carriersTwo); 
allCarriers.sort(); 

count = allCarriers.length; 

for(i=0;i<count;i++) { 
    alert(allCarriers[i]); 
} 

function normalize(arr){ 
    var carriers = arr[0].split('|') 
    , i = carriers.length 
    ;//var 

    while(i--){ 
     carriers[i] = carriers[i].trim(); 
    } 

    return carriers; 
} 
0

Проблема заключается в том, что у вас есть начальные пробелы в названиях носителей.

 [" Some Other Company", " Chicago Insurance Company ", " Hospital Insurance Corporation", " New York Health Care Insurance Company ", "Advantage Care ", "St. Joseph's Medical Center "] 

Вы можете удалить начальные пробелы и получить результат, который вы ищете, как это:

carriersOne = ['St. Joseph\'s Medical Center | New York Health Care Insurance Company | Some Other Company']; 
carriersTwo = ['Advantage Care | Chicago Insurance Company | Hospital Insurance Corporation']; 

carriersOne = carriersOne[0].split('|'); 
carriersTwo = carriersTwo[0].split('|'); 

allCarriers = carriersOne.concat(carriersTwo); 
allCarriers = allCarriers.map(
       function(carrier){ 
         // replace leading and trailing spaces 
         return carrier.replace(/^\s+|\s+$/g,''); 
       } 
       ); 
allCarriers.sort(); 
console.log(allCarriers); 
+0

Блестящие ответы на все !, спасибо! – TopTomato

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