javascript 如何在JS中使用自定义字母表按字符串对数组中的数组进行排序?

ftf50wuq  于 2024-01-05  发布在  Java
关注(0)|答案(2)|浏览(117)

为什么这不是一个重复:“原始”排序的字符,而不是字符串。我试图排序的字符串。这是一个完全不同的问题,它需要能够排序整个字符串,而不仅仅是一个字符。
我有这个数组:

[
    ["ik", "p", "I; me", 1],
    ["pat", "pre", "plus", 1],
    ["qeol", "adj", "only", 1],
    ["nei", "adj", "not", 1]
]

字符串
我想按第一项对数组进行排序,并使用自定义字母表,其中q介于n和o之间。
所以,它应该看起来像这样:

[
    ["ik", "p", "I; me", 1],
    ["nei", "adj", "not", 1],
    ["qeol", "adj", "only", 1],
    ["pat", "pre", "plus", 1]
]


我尝试了this,并试图调整它,使q去之间的n和o,但没有工作。

words.sort(function(a, b) { 
    return a[0].toLowerCase() === "q" && a[0] < "n"? 1: (a[0] > b[0]? 1: -1);
});


我只是尝试随机废话,所以当然没有工作
我该怎么做?

l5tcr1uw

l5tcr1uw1#

你可以构建一个自定义排序的函数,方法是将一个字符串交给一个排序,直到字符串结束。

const 
    data = [["ik", "p", "I; me", 1], ["pat", "pre", "plus", 1], ["qeol", "adj", "only", 1], ["nei", "adj", "not", 1]],
    alphabet = ' abcdefghijklmnqoprstuvwxyz',
    sortBy = alphabet => {
        const order = Object.fromEntries([...alphabet].map((l, i) => [l, i + 1]));
    
        return (a, b) => {
            for (let i = 0, min = Math.min(a.length, b.length); i < min; i++) {
                if (a[i] === b[i]) continue;
                return order[a[i]] - order[b[i]];
            }
            return a.length - b.length;
        };
    },
    custom = (fn => (a, b) => fn(a[0], b[0]))(sortBy(alphabet));

console.log(...["ikb", "nqq", "ik", "pat", "qeol", "nei", "npo", "nop", "ika"].sort(sortBy(alphabet)));

console.log(data.sort(custom));

个字符

332nm8kg

332nm8kg2#

可以通过使用Map来建立自定义顺序,该Map为字母表中的每个字符分配唯一索引。

const
   alphabet = Array.from(' abcdefghijklmnqoprstuvwxyz'),
   order = new Map(alphabet.map((char, i) => [char, i]));

字符串
该索引可以表示TrueSet中的每个项(在本例中为数组)。

const
    repr = array => order.get(array[0][0]),
    got = TrueSet.of(repr, ORDER.ASCENDING)
        .letAll(data)


瞧!您的物品将根据您的自定义字母表进行排序。
通过以下方式验证建议的解决方案:

import {TrueSet} from "@ut8pia/classifier/queue/TrueSet.js";
import {ORDER} from "@ut8pia/classifier/global.js";

const 
    data = [
        ["ik", "p", "I; me", 1],
        ["pat", "pre", "plus", 1],
        ["qeol", "adj", "only", 1],
        ["nei", "adj", "not", 1]
    ],

    expected = [
        ["ik", "p", "I; me", 1],
        ["nei", "adj", "not", 1],
        ["qeol", "adj", "only", 1],
        ["pat", "pre", "plus", 1]
    ];

assert.deepEqual(got.toArray(), expected)


@ut8pia/classifier库的在线文档提供了对representation函数概念的广泛探索。

相关问题