我需要对这个数组进行排序
['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^' , '-', '_']作为
[ , %, % hello, _, -, ., ^, $, 1, 5, 7, a, f, z] 但我得到的结果是
[ , _, -, ., %, % hello, ^, $, 1, 5, 7, a, f, z] 有没有办法创建自定义排序器?在这种情况下,是否有可能在其他符号之前获取任何特定字符或符号的位置,例如'%‘?
var collator = Intl.Collator();
var letters = ['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^' , '-', '_'];
console.log(letters.sort(collator.compare));
发布于 2020-03-16 20:02:59
你能试试这个吗?我不确定这是不是你的问题的完整解决方案
var collator = Intl.Collator();
var letters = ['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^', '-', '_'];
arr = letters.sort(collator.compare);
arr.forEach((item, index) => {
if (String(item).indexOf('%') >= 0) {
arr.splice(0, index + 1, ...arr.slice(0, index + 1).sort())
}
});
console.log(arr);发布于 2020-03-16 20:28:57
您可以通过首先指定要排序的字母来进行自定义排序。
这种方法使用映射进行排序,其中每个项都映射到下面的数组,然后所有项都按照排序的索引的顺序进行映射。
[
{
index: 5,
value: "%"
},
{
index: 8,
value: "% hello"
},
{
index: 0,
value: "$"
},
{
index: 9,
value: " "
},
{
index: 13,
value: "_"
},
{
index: 12,
value: "-"
},
{
index: 6,
value: "."
},
{
index: 11,
value: "^"
},
{
index: 4,
value: "1"
},
{
index: 7,
value: "5"
},
{
index: 2,
value: "7"
},
{
index: 3,
value: "a"
},
{
index: 10,
value: "f"
},
{
index: 1,
value: "z"
}
]
var array = ['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^', '-', '_'],
first = '%$ ', // take % first, then $ then space then rest by standard sorting
check = [...first, ''],
result = array
.map((item, index) => {
var value = '';
for (let c of [...item.toString()]) {
value += check
.map(v => !check.includes(c) && !v || v === c ? c : '\uFFFF')
.join('');
}
return { index, value };
})
.sort((a, b) => a.value.localeCompare(b.value))
.map(({ index }) => array[index]);
console.log(result);
发布于 2020-03-16 20:38:18
您可以保留所需的order数组,然后按如下方式进行排序
let Order = { ' ': 1, '%': 2, '_': 4, '-': 5, '.': 6, '^': 7, '$': 8 }
let array = ['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^', '-', '_'];
array.sort((a, b) => {
if (Order[a] && Order[b]) {
return Order[a] - Order[b];
} else {
let x = [...a.toString()].find(e => Order[e]);
let y = [...b.toString()].find(e => Order[e]);
if (Order[x] && Order[y])
return (Order[x]) - (Order[y]);
return a.toString().localeCompare(b)
}
});
console.log(array)
https://stackoverflow.com/questions/60704123
复制相似问题