首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JS中的自定义Intl.Collator

JS中的自定义Intl.Collator
EN

Stack Overflow用户
提问于 2020-03-16 18:21:13
回答 3查看 266关注 0票数 1

我需要对这个数组进行排序

代码语言:javascript
复制
['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^' , '-', '_']

作为

代码语言:javascript
复制
[ , %, % hello, _, -, ., ^, $, 1, 5, 7, a, f, z] 

但我得到的结果是

代码语言:javascript
复制
[ , _, -, ., %, % hello, ^, $, 1, 5, 7, a, f, z] 

有没有办法创建自定义排序器?在这种情况下,是否有可能在其他符号之前获取任何特定字符或符号的位置,例如'%‘?

代码语言:javascript
复制
 var collator = Intl.Collator();
var letters = ['$', 'z', 7, 'a', 1, '%', '.', 5, '% hello', ' ', 'f', '^' , '-', '_'];
console.log(letters.sort(collator.compare));

EN

回答 3

Stack Overflow用户

发布于 2020-03-16 20:02:59

你能试试这个吗?我不确定这是不是你的问题的完整解决方案

代码语言:javascript
复制
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);
票数 1
EN

Stack Overflow用户

发布于 2020-03-16 20:28:57

您可以通过首先指定要排序的字母来进行自定义排序。

这种方法使用映射进行排序,其中每个项都映射到下面的数组,然后所有项都按照排序的索引的顺序进行映射。

代码语言:javascript
复制
[
    {
        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"
    }
]

代码语言:javascript
复制
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);

票数 1
EN

Stack Overflow用户

发布于 2020-03-16 20:38:18

您可以保留所需的order数组,然后按如下方式进行排序

代码语言:javascript
复制
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)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60704123

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档