如何对 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);
我需要对字符串进行排序。但是当它在字符串中找到空格时它没有正确排序。我怎样才能让它不对空格进行排序?
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);