Tentar obter o valor mais alto e mais baixo de uma matriz que eu sei que conterá apenas números inteiros parece ser mais difícil do que eu pensava.
var numArray = [140000, 104, 99];
numArray = numArray.sort();
alert(numArray)
Eu esperava que isso mostrasse 99, 104, 140000
. Em vez disso, mostra 104, 140000, 99
. Parece que o tipo está lidando com os valores como strings.
Existe uma maneira de obter a função de classificação para realmente classificar no valor inteiro?
javascript
arrays
sorting
numbers
peirix
fonte
fonte
NaN
. Seria bom ver uma resposta altamente classificada que lida comNaN
.Respostas:
Por padrão, o método de classificação classifica os elementos em ordem alfabética. Para classificar numericamente, basta adicionar um novo método que lide com classificações numéricas (sortNumber, mostrado abaixo) -
No ES6, você pode simplificar isso com as funções de seta:
Documentação:
A Mozilla
Array.prototype.sort()
recomenda essa função de comparação para matrizes que não contêm Infinity ou NaN. (PorqueInf - Inf
é NaN, não 0).Também exemplos de classificação de objetos por chave.
fonte
numberArray.sort((a, b) => (a - b));
Yay! Eu acho que isso está próximo do caminho imediato. Nota: verifique se o seu mecanismo JS suporta Arrow Functions.Baseando-se em todas as respostas acima, elas também podem ser feitas em uma linha como esta:
fonte
var arr = [140000, 104, 99].sort(function(a,b) { return a-b; });
. Ou mais compacto, no ES6let arr = [140000, 104, 99].sort((a,b) => a-b);
function
ereturn
, mas na verdade não está usando o verdadeiro objetivo da função da seta de passarthis
. Esse código implica que há algumathis
passagem de contexto acontecendo, mas não existe. Confuso para outros desenvolvedores lerem seu código, apenas para salvar alguns caracteres. Não dependa de efeitos colaterais - codifique com propósito!this
para a função, mas isso não é verdade. Na verdade, ele negligencia a criação de uma variávelthis
e aarguments
que geralmente substitui as variáveis pai. A única razão pela qual você pode usarthis
dentro de uma função de seta é o escopo lexical.array.sort faz uma classificação lexicográfica por padrão; para uma classificação numérica, forneça sua própria função. Aqui está um exemplo simples:
Observe também que a classificação funciona "no local", não há necessidade da atribuição.
fonte
Essa resposta é equivalente a algumas das respostas existentes, mas as funções de seta do ECMAScript 6 fornecem uma sintaxe muito mais compacta que nos permite definir uma função de classificação em linha sem sacrificar a legibilidade:
É suportado na maioria dos navegadores hoje .
fonte
objArray=objArray.sort((a,b)=>a.numProperty - b.numProperty);
e se a propriedade é uma string que você pode fazer:objArray=objArray.sort((a,b)=>a.strProperty.localeCompare(b.strProperty));
Dito isto, esta questão pede especificamente sobre como classificar um array de inteirosEstou surpreso por que todo mundo recomenda passar uma função de comparador
sort()
, o que torna a classificação realmente lenta!Para classificar números, basta criar qualquer TypedArray :
fonte
A razão pela qual a função de classificação se comporta tão estranha
A partir da documentação :
Se você imprimir os valores de ponto unicode da matriz, isso ficará claro.
Isso retorna: "49, 49, 57".
Agora, como 140000 e 104 retornaram os mesmos valores (49), ele corta o primeiro índice e verifica novamente:
Se classificarmos isso, obteremos:
então 104 vem antes de 140000.
Portanto, o resultado final será:
104, 140000, 99
Conclusão:
sort()
faz a classificação olhando apenas para o primeiro índice dos números.sort()
não se importa se um número inteiro é maior que outro, ele compara o valor do unicode dos dígitos e, se houver dois valores iguais de unicode, verifica se existe um próximo dígito e o compara também.Para classificar corretamente, você precisa passar uma função de comparação,
sort()
como explicado aqui .fonte
Eu concordo com aks, no entanto, em vez de usar
Você deveria usar
fonte
>
e<
ainda comparam aeb como strings.No novo mundo ES6, é muito mais fácil fazer uma espécie
Isso é tudo que você precisa :)
fonte
No JavaScript, o comportamento padrão do método sort () é classificar valores em uma matriz em ordem alfabética.
Para classificar por número, você deve definir uma função de classificação numérica (o que é muito fácil):
fonte
Array.prototype.sort () é o método go para classificar matrizes, mas há alguns problemas que precisamos estar cientes.
A ordem de classificação é, por padrão, lexicográfica e não numérica, independentemente dos tipos de valores na matriz. Mesmo se a matriz tiver todos os números, todos os valores serão convertidos em sequência e classificados lexicograficamente.
Então, precisamos personalizar o método sort () e reverse () como abaixo.
URL referido
Para classificar números dentro da matriz
Para reverter números dentro da matriz
URL referido
fonte
A questão já foi respondida, a maneira mais curta é usar o
sort()
método. Mas se você estiver procurando por mais maneiras de classificar sua matriz de números e também adora ciclos, verifique o seguinteClassificação de inserção
Crescente:
Descendente:
Tipo de seleção:
Crescente:
Descendente:
Diverta-se
fonte
sort()
em um TypedArray como esta resposta sugere . Certamente eles não serão mais rápidos para matrizes de médio a grande porte, porque esses são algoritmos O (n ^ 2).A função 'numericamente' abaixo serve para classificar a matriz de números numericamente em muitos casos, quando fornecida como uma função de retorno de chamada:
Mas, em alguns casos raros, em que a matriz contém números muito grandes e negativos, pode ocorrer um erro de estouro, pois o resultado de ab fica menor que o menor número com o qual o JavaScript pode lidar.
Portanto, uma maneira melhor de escrever numericamente a função é a seguinte:
fonte
DBL_MIN - DBL_MAX
), mas o sub-fluxo não é possível. O cancelamento catastrófico torna o resultado impreciso, perdendo a maioria de seus "dígitos significativos", masa-b
sempre será diferente de zero e terá o sinal certo para a! = B.para lidar com indefinido, nulo e NaN: o nulo se comporta como 0, NaN e indefinido termina.
fonte
Apenas para uma matriz normal de valores de elementos:
Para uma matriz de objetos:
fonte
Minha forma favorita pessoal dessa função permite um parâmetro para Ascendente ou Descendente:
Uso tão simples quanto:
jsFiddle
Ou exemplo de snippet de código aqui!
.smartSort ('asc' | 'desc')
Agora divirta-se ainda mais com um método de classificação que classifica uma matriz cheia de vários itens! Atualmente, não abrange "associativo" (também conhecido como chave de cadeia), mas abrange todo tipo de valor! Não apenas classificará os vários valores
asc
ou dedesc
acordo, mas também manterá constante "posição" de "grupos" de valores. Em outras palavras; ints são sempre os primeiros, depois as strings, as matrizes (sim, estou tornando isso multidimensional!), os objetos (não filtrados, elemento, data) e, finalmente, indefinidos e nulos!"Por quê?" você pergunta. Por que não!
Agora vem em 2 sabores! O primeiro deles requer navegadores mais recentes, pois ele usa
Object.defineProperty
para adicionar o método aoArray.protoype
objeto. Isto permite a facilidade de naturais utilização, tais como:myArray.smartSort('a')
. Se você precisa implementar em navegadores mais antigos ou simplesmente não gosta de modificar objetos nativos, role para baixo até a versão Somente método .jsFiddle Array.prototype.smartSort ('asc | desc')
O uso é simples! Primeiro faça uma matriz maluca como:
Em seguida, basta classificá-lo!
Apenas método
O mesmo que o anterior, exceto apenas como um método simples!
Usar:
Método jsFiddle smartSort (matriz, "asc | desc")
fonte
Tente este código:
HTML:
Código JavaScript:
fonte
Experimente este código como abaixo
fonte
fonte
Embora não seja obrigatório em JavaScript, se você desejar retornar estritamente -1, 0 ou 1 (semelhante à maneira como o operador de nave espacial funciona em PHP), você poderá usá-lo .
sort()
compareFunction
Math.sign()
O
compareFunction
abaixo retorna estritamente -1, 0 ou 1:fonte
Esta é a solução já proposta e aceita como método no protótipo Array:
fonte
O método de classificação converte elementos de matriz em sequência. Portanto, abaixo do caminho também funciona bem com números decimais com elementos de matriz.
E fornece o resultado esperado.
fonte
Substituindo o método de classificação.
fonte
A função de classificação padrão é classificada na ordem do dicionário:
O exemplo acima não é o caso que queremos para números. Portanto, se você possui números inteiros e a função de classificação padrão não está funcionando (porque é classificada na ordem dos dicionários), é necessário implementar sua própria função:
Espero que você tenha uma pergunta em mente como isso funciona? Aqui, quando fornecemos um método na função de classificação, ele passa dois números por vez e se o número retornar
Seguindo isso para todos os números, classifica a matriz do número inteiro.
Se você estiver usando o ES6, escreva uma função de seta:
fonte
Aqui está minha função de matriz de classificação na biblioteca de utilitários:
fonte
a-b
deve ser usado em seu lugar. (Você pode ser extravagante e fazer umNumber(a>b)-0.5
, no entanto, isso ainda não é um tipo estável).