合并和排序Javascript数组。获得不可预测的结果。

3
这是数据以对象形式给出的,其中元素由管道字符分隔。
首先需要将两个数组合并,然后按字母顺序排序。下面的示例是一个简化的示例。但是某些东西会使排序函数失效,结果很奇怪。
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

w-t-bleep指令是什么? 注意:如果您使用单个名称或可预测的名字和姓氏,它会很好地合并和排序。

2
空格在A之前。 - Paul
5个回答

5

这是因为您没有去掉周围的空格,尤其是前导空格。排序会有问题,因为空格会排在所有字母之前。以下代码应该可以解决这个问题,假设整行没有周围的空格:

```python new_list = sorted(old_list, key=lambda x: x.strip()) ```
// 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*/, '')});

仅仅为了这个,我也会从末尾删除空格,就像这样carriersOne[0].split("|").map(function(e){return e.replace(/^\s*/, '').replace(/\s*$/, '')});。我相信,如果有更好的方法,@xdazz会知道的。 - Saurabh Kumar

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

空格的ASCII码是32,大写字母从65开始,小写字母从97开始。这就是为什么空格排在A和a之前的原因。

您可以使用正则表达式或简单地利用underscore.js来修剪它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接