如何对 javascript 中带空格的字符串进行排序?

How sort string with spaces in javascript?

我需要对字符串进行排序。但是当它在字符串中找到空格时它没有正确排序。我怎样才能让它不对空格进行排序?

const array = [
        { attributes: { name: 'abcd efg' } },
        { attributes: { name: 'Übd cd' } },
        { attributes: { name: 'Ku cdf' } },
        { attributes: { name: 'äb' } },
        { attributes: { name: 'abc' } }
      ]
      array.sort((a, b) => {
        if (a.attributes.name.toUpperCase()
          .localeCompare(b.attributes.name.toUpperCase(), 'de', { sensitivity: 'base' })) { return -1 }
        if (b.attributes.name.toUpperCase()
          .localeCompare(b.attributes.name.toUpperCase(), 'de', { sensitivity: 'base' })) { return 1 }
        return 0
      })
console.log('typeof array', array)

我希望看到:

[
{ attributes: { name: 'abc' } },
{ attributes: { name: 'abcd efg' } },
{ attributes: { name: 'äb' } },
{ attributes: { name: 'Ku cdf' } },
{ attributes: { name: 'Übd cd' } }
]

试试这个....

var hasLeading = s => /^\S+\s\S+\s\S+$/.test(s);
var array = [
    { attributes: { name: 'abcd efg' } },
    { attributes: { name: 'Übd cd' } },
    { attributes: { name: 'Ku cdf' } },
    { attributes: { name: 'ab' } }
];

array.sort((a, b) => hasLeading(b.attributes.name.toUpperCase()) - hasLeading(a.attributes.name.toUpperCase()) || a.attributes.name.toUpperCase() > b.attributes.name.toUpperCase() || -(a.attributes.name.toUpperCase() < b.attributes.name.toUpperCase())
);

console.log(array);

String.localeCompare 方法 returns 一个数字,指示参考字符串是在排序顺序之前、之后还是与给定字符串相同...与什么相同Array.sort 应该是 return:

const array = [
  { attributes: { name: "abcd efg" } },
  { attributes: { name: "Übd cd" } },
  { attributes: { name: "Ku cdf" } },
  { attributes: { name: "ab" } }
];
array.sort((a, b) => a.attributes.name.toUpperCase().localeCompare(b.attributes.name.toUpperCase(), "de", { sensitivity: "base" }));
console.log(array);

localCompare 的工作方式是,如果第一个字符串较小,即在第二个字符串之前,它将 return 为负数。 如果第一个字符串更大,即它在第二个字符串之后,它将 return 一个正数。

这一行:

if (a.attributes.name.toUpperCase()
          .localeCompare(b.attributes.name.toUpperCase(), 'de', { sensitivity: 'base' })) { return -1 }

即使第一个字符串更大或第二个字符串更大,也将为真。

问题是 if (-1)if(any_negative_value) 被认为是 true。即使 localeCompare() return 是负值,您的第一个 if 语句也将始终执行。第二个 if 语句永远不会被执行。因此,无论 a.attributes.name 在字典序上更大还是 b.attributes.name 更大,第一个 if 语句将始终被执行。

您不需要 if 语句。 sort 函数只需要由 localCompare() 编辑的数字 return。

因此,您只需 return localeCompare() 的值,它就会正确地对属性进行排序。

const array = [
        { attributes: { name: 'abcd efg' } },
        { attributes: { name: 'Übd cd' } },
        { attributes: { name: 'Ku cdf' } },
        { attributes: { name: 'ab' } }
]
      array.sort(
        (a, b) => a
          .attributes
          .name
          .toUpperCase()
          .localeCompare(b
            .attributes
            .name
            .toUpperCase(), 
            'de', 
            { sensitivity: 'base' }
          )
        );
console.log('typeof array', array)

您不需要删除空格。只需使用字符串的小写版本即可。

const array = [
  { attributes: { name: 'abcd efg' } },
  { attributes: { name: 'Übd cd' } },
  { attributes: { name: 'Ku cdf' } },
  { attributes: { name: 'ab' } }
];

const sensitivity = { sensitivity: 'base' };

function getLocale(a, b) {
  return a['localeCompare'](b, 'de', sensitivity);
}

array.sort((a, b) => {
  const al = a.attributes.name.toLowerCase();
  const bl = b.attributes.name.toLowerCase();
  return getLocale(al, bl) > getLocale(bl, al);
});

console.log('typeof array', array);