Eu tenho os seguintes objetos usando AJAX e os armazenei em uma matriz:
var homes = [
{
"h_id": "3",
"city": "Dallas",
"state": "TX",
"zip": "75201",
"price": "162500"
}, {
"h_id": "4",
"city": "Bevery Hills",
"state": "CA",
"zip": "90210",
"price": "319250"
}, {
"h_id": "5",
"city": "New York",
"state": "NY",
"zip": "00010",
"price": "962500"
}
];
Como crio uma função para classificar os objetos pela price
propriedade em ordem crescente ou decrescente usando apenas JavaScript?
javascript
arrays
sorting
TomHankers
fonte
fonte
Respostas:
Classifique as casas por preço em ordem crescente:
Ou após a versão ES6:
Alguma documentação pode ser encontrada aqui .
fonte
string1.localeCompare(string2)
para comparação de stringlocaleCompare()
maiúsculas de minúsculas . Se você quer distinção entre maiúsculas e minúsculas, pode usar(string1 > string2) - (string1 < string2)
. Os valores booleanos são coagidos aos números inteiros 0 e 1 para calcular a diferença.localeCompare()
documentação mostra que você pode indicar explicitamente se deseja distinção entre maiúsculas e minúsculas, classificação numérica e outras opções.Aqui está uma versão mais flexível, que permite criar funções de classificação reutilizáveis e classificar por qualquer campo.
fonte
sort_by
é executado em O (1) e retorna uma função usada pela classificação interna (O (N log N)) para comparar itens em uma lista. A complexidade total é O (n log n) * O (1) que se reduz a O (n log n), ou o mesmo que uma classificação rápida.var key = primer ? function (x) { return primer(x[field]); } : function (x) { return x[field]; }
[1,-1][+!!reverse]
pareça legal, é uma coisa horrível de se fazer. Se um usuário não puder chamar seu método corretamente, castigue-o, não tente entendê-lo de alguma forma, não importa o quê.Para classificá-lo, você precisa criar uma função comparadora usando dois argumentos. Em seguida, chame a função de classificação com essa função comparadora da seguinte maneira:
Se você deseja classificar ascendente, alterne as expressões de cada lado do sinal de menos.
fonte
para classificação de strings, caso alguém precise,
fonte
Se você possui um navegador compatível com ES6, pode usar:
A diferença entre ordem de classificação crescente e decrescente é o sinal do valor retornado por sua função de comparação:
Aqui está um trecho de código de trabalho:
fonte
Você quer classificá-lo em Javascript, certo? O que você quer é a
sort()
função . Nesse caso, você precisa escrever uma função comparadora e passá-la parasort()
algo assim:Seu comparador pega um de cada um dos hashes aninhados dentro da matriz e decide qual deles é mais alto, verificando o campo "preço".
fonte
Eu recomendo o GitHub: Array sortBy - uma melhor implementação de
sortBy
método que usa a transformação SchwartzianaMas, por enquanto, vamos tentar essa abordagem Gist: sortBy-old.js .
Vamos criar um método para classificar matrizes capazes de organizar objetos por alguma propriedade.
Criando a função de classificação
Configurando dados não classificados
Usando isso
Organize a matriz,
"date"
conformeString
Se você deseja ignorar distinção entre maiúsculas e minúsculas, defina o
parser
retorno de chamada:Se você deseja converter o
"date"
campo comoDate
tipo:Aqui você pode jogar com o código: jsbin.com/lesebi
Graças a @Ozesh por seus comentários, o problema relacionado às propriedades com valores falsos foi corrigido.
fonte
var checkNaN = function (value) { return Number.isNaN(Number(value)) ? 0 : value; }
seguido por: return function (array, o) { .... a = _getItem.call (o, a); a = checkNaN (a); b = _getItem.call (o, b); b = checkNaN (b); retornar o.desc * (a <b? -1: + (a> b)); });Use lodash.sortBy , (instruções usando commonjs, você também pode colocar o script include-tag para o cdn na parte superior do seu html)
Ordem decrescente
Ordem ascendente
fonte
const sortBy = require('lodash/sortBy'); let calendars = sortBy(calendarListResponse.items, cal => cal.summary);
import { orderBy } from 'lodash'; ... ... return orderBy ( rows, 'fieldName' ).reverse();
Isso poderia ter sido alcançado através de uma função de classificação valueof () simples de uma linha . Execute o snippet de código abaixo para ver a demonstração.
fonte
Estou um pouco atrasado para a festa, mas abaixo está minha lógica para classificar.
fonte
Embora eu esteja ciente de que o OP queria classificar uma matriz de números, essa pergunta foi marcada como a resposta para perguntas semelhantes sobre seqüências de caracteres. Por esse motivo, as respostas acima não consideram a classificação de uma matriz de texto em que a caixa é importante. A maioria das respostas pega os valores da string e os converte em maiúsculas / minúsculas e, em seguida, classifica de uma maneira ou de outra. Os requisitos aos quais eu aderi são simples:
O que espero é que
[ A, a, B, b, C, c ]
as respostas acima retornemA, B, C, a, b, c
. Na verdade, eu cocei minha cabeça por mais tempo do que queria (e é por isso que estou postando isso na esperança de que ajude pelo menos uma outra pessoa). Enquanto dois usuários mencionam alocaleCompare
função nos comentários para a resposta marcada, não vi isso até depois de me deparar com a função enquanto procurava. Depois de ler a documentação String.prototype.localeCompare (), consegui fazer isso:Isso informa à função para classificar valores em maiúsculas antes de valores em minúsculas. O segundo parâmetro na
localeCompare
função é definir o código do idioma, mas se você o deixar,undefined
ele descobrirá automaticamente o código do idioma para você.Isso funciona da mesma forma para classificar uma matriz de objetos:
fonte
Você pode usar o
sort
método JavaScript com uma função de retorno de chamada:fonte
Aqui está um ponto culminante de todas as respostas acima.
Validação do Fiddle: http://jsfiddle.net/bobberino/4qqk3/
fonte
Para classificar uma matriz, você deve definir uma função comparadora. Essa função sempre será diferente no padrão ou ordem de classificação desejada (por exemplo, ascendente ou descendente).
Vamos criar algumas funções que classifiquem uma matriz ascendente ou descendente e que contenham objeto, sequência ou valores numéricos.
Classifique os números (em ordem alfabética e crescente):
Classifique os números (em ordem alfabética e descendente):
Classificar números (numericamente e crescente):
Classificar números (numericamente e decrescente):
Como acima, use o método sorterPriceAsc e sorterPriceDes com sua matriz com a chave desejada.
fonte
Também trabalhei com algum tipo de classificação e vários campos:
Resultado
fonte
Embora seja um exagero apenas para classificar uma única matriz, essa função de protótipo permite classificar as matrizes Javascript por qualquer chave, em ordem crescente ou decrescente, incluindo chaves aninhadas , usando a
dot
sintaxe.Uso:
Classificação por propriedades aninhadas com sintaxe de ponto ou sintaxe de matriz:
Classificando por várias chaves:
Você pode bifurcar o repositório: https://github.com/eneko/Array.sortBy
fonte
sortBy
sintaxe concisa. Simples de usar, mesmo com campos aninhados, mantendo excelente legibilidade do código. Obrigado!Com o ECMAScript 6, a resposta da StoBor pode ser ainda mais concisa:
fonte
Ordem decrescente de preço:
Ordem crescente de preço:
fonte
Se você usa Underscore.js , tente sortBy:
fonte
Aqui está uma versão ligeiramente modificada da implementação elegante do livro "JavaScript: The Good Parts".
NOTA : Esta versão do
by
é estável . Ele preserva a ordem da primeira classificação enquanto executa a próxima classificação em cadeia.Eu adicionei
isAscending
parâmetro a ele. Também o converteu emES6
padrões e peças boas "mais recentes", conforme recomendado pelo autor.Você pode classificar em ordem crescente e decrescente e em cadeia por várias propriedades.
fonte
{"first":"Curly","last":"Howard", "property" : {"id" : "1"}}
tipo de matriz por id?by
com name = "propriedade", nestedName = "id"Apenas para uma matriz normal de valores de elementos:
Para uma matriz de objetos:
fonte
Crie uma função e classifique com base na entrada usando o código abaixo
fonte
Você pode usar string1.localeCompare (string2) para comparação de strings
Note-se que
localCompare
é caso em sensívelfonte
Para classificação em vários campos de objetos de matriz. Digite o nome do seu campo na
arrprop
matriz como["a","b","c"]
depois passe o segundo parâmetroarrsource
da fonte real que queremos classificar.fonte
Você precisará de duas funções
Em seguida, você pode aplicar isso a qualquer propriedade do objeto:
fonte
Recentemente, escrevi uma função universal para gerenciar isso para você, se você quiser usá-lo.
fonte
fonte
Olá, depois de ler este artigo, criei um sortComparator para minhas necessidades, com a funcionalidade de comparar mais de um atributo json, e quero compartilhá-lo com você.
Esta solução compara apenas seqüências de caracteres em ordem crescente, mas a solução pode ser facilmente estendida para cada atributo para oferecer suporte: ordem inversa, outros tipos de dados, uso de localidade, transmissão etc.
e o resultado é
e outro tipo
com resultado
fonte
Um código simples:
fonte
http://yazilimsozluk.com/sort-array-in-javascript-by-asc-or-desc
fonte