Classificação de elementos de array natural: strings com números
Este artigo se aprofunda na tarefa de classificar arrays contendo elementos que combinam strings e números em um ordem natural, onde as sequências numéricas dentro das strings devem ser consideradas no processo de classificação.
O Problema
Considere um array como este:
["IL0 Foo", "PI0 Bar", "IL10 Baz", "IL3 Bob says hello"]
Se tentarmos classificar esse array usando uma função de classificação convencional, podemos acabar com uma ordem incorreta:
["IL0 Foo", "IL10 Baz", "IL3 Bob says hello", "PI0 Bar"]
A solução: classificação natural
Para obter uma classificação natural, podemos aproveitar a seguinte função JavaScript:
function naturalCompare(a, b) { var ax = [], bx = []; a.replace(/(\d )|(\D )/g, function(_, $1, $2) { ax.push([$1 || Infinity, $2 || ""]) }); b.replace(/(\d )|(\D )/g, function(_, $1, $2) { bx.push([$1 || Infinity, $2 || ""]) }); while(ax.length && bx.length) { var an = ax.shift(); var bn = bx.shift(); var nn = (an[0] - bn[0]) || an[1].localeCompare(bn[1]); if(nn) return nn; } return ax.length - bx.length; }
Esta função tokeniza as strings de entrada em matrizes de valores numéricos e não numéricos. Em seguida, ele compara os arrays lexicograficamente, levando em consideração os valores numéricos como inteiros e os valores não numéricos como strings.
Exemplo
Aplicando esta função ao array fornecido resulta na ordem de classificação natural desejada:
test = [ "img12.png", "img10.png", "img2.png", "img1.png", "img101.png", "img101a.png", "abc10.jpg", "abc10", "abc2.jpg", "20.jpg", "20", "abc", "abc2", "" ]; test.sort(naturalCompare) document.write("<pre>" JSON.stringify(test,0,3));
Isso produz a seguinte matriz classificada:
[ "", "abc", "abc2", "abc10", "abc10.jpg", "20", "20.jpg", "img1.png", "img2.png", "img10.png", "img12.png", "img101.png", "img101a.png" ]
Isenção de responsabilidade: Todos os recursos fornecidos são parcialmente provenientes da Internet. Se houver qualquer violação de seus direitos autorais ou outros direitos e interesses, explique os motivos detalhados e forneça prova de direitos autorais ou direitos e interesses e envie-a para o e-mail: [email protected]. Nós cuidaremos disso para você o mais rápido possível.
Copyright© 2022 湘ICP备2022001581号-3