有一个题:将'AT/Aq/CD/BA/BC/TH/TG/RT/EW/BH/JA/TR/Cv/Bp'这种类型的字符串处理,将首字母相同的放在一起,并且用/连接,首字母的顺序按照字母表排序,最终变成这样的形式:["AT/Aq", "BA/BC/BH/Bp", "CD/Cv", "EW", "JA", "RT", "TG/TH/TR"]
有以下三种方法,先统一将字符串转换成数组,并调用sort方法进行排序:
- 使用对象映射的办法,将首字母作为对象的key值,对应的value作两步处理:1.初始化时,将数组里的元素直接赋值进去。2.如果有首字母相同的数据,就进行字符串拼接。得到了对象后,将对象的value值转换成数组元素。
var str = 'AT/Aq/CD/BA/BC/TH/TG/RT/EW/BH/JA/TR/Cv/Bp';
const transform = function (str) {
var obj = {};
var array = [];
var arr = str.split('/').sort();
arr.forEach(x => {
var charKey = x[0];
if (obj[charKey]) {
obj[charKey] = obj[charKey] + '/' + x;
} else {
obj[charKey] = x;
}
})
array = Object.values(obj);
return array
}
console.log(transform(str));
- 使用数组的方法,当元素和它后面的元素不同时,插入一个符号,最终得到的结果是:相同的元素排在一起,不同的元素之间有&做间隔,然后再处理得到的数组,将它拼接成字符串后,以&为间隔符切割成数组,将数组里的元素切割,然后过滤空元素,再调用join方法,将其拼接成用/连接的字符串。
var str = 'AT/Aq/CD/BA/BC/TH/TG/RT/EW/BH/JA/TR/Cv/Bp';
const transtrom = function (str) {
var arr = str.split('/').sort();
var array = [];
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i][0] !== arr[i + 1][0]) {
arr.splice(i + 1, 0, '&')
++i;
}
}
str = arr.join();
array = str.split('&').map(_ => _.split(',').filter(_ => _).join('/'));
return array
}
console.log(transtrom(str));
- 使用数组下标和字母表对应的方式
var str = 'AT/Aq/CD/BA/BC/TH/TG/RT/EW/BH/JA/TR/Cv/Bp';
const transtrom = function (str) {
var arr = str.split("/").sort();
var array = [];
for (let i = 0; i < arr.length - 1; i++) {
var index = arr[i][0].charCodeAt() - 65;
if (arr[i][0] === arr[i + 1][0]) {
array[index] = array[index] ? array[index] + arr[i + 1] : arr[i] + arr[i + 1];
} else {
array[index] = array[index] ? array[index] + '' : arr[i];
}
}
return array
}
console.log(transtrom(str));