将字符串处理首字母相同放在一起变成数组

有一个题:将'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));

猜你喜欢

转载自blog.csdn.net/liangxhblog/article/details/81809550