É possível classificar e reorganizar uma matriz que se parece com isso:
itemsArray = [
['Anne', 'a'],
['Bob', 'b'],
['Henry', 'b'],
['Andrew', 'd'],
['Jason', 'c'],
['Thomas', 'b']
]
para coincidir com o arranjo dessa matriz:
sortingArr = [ 'b', 'c', 'b', 'b', 'a', 'd' ]
Infelizmente, não tenho IDs para acompanhar. Eu precisaria priorizar a matriz de itens para corresponder ao sortingArr o mais próximo possível.
Atualizar:
Aqui está a saída que estou procurando:
itemsArray = [
['Bob', 'b'],
['Jason', 'c'],
['Henry', 'b'],
['Thomas', 'b']
['Anne', 'a'],
['Andrew', 'd'],
]
Alguma idéia de como isso pode ser feito?
javascript
user1448892
fonte
fonte
Respostas:
Algo como:
Aqui está um código mais curto, mas destrói a
sorting
matriz:fonte
Resposta de uma linha.
fonte
itemsArray
. Dependendo do requisito de desempenho, seria muito mais seguroitemsArray.slice().sort(...)
.sortingArr
que todos os valores contenhamitemsArray
. A correção é empurrar os itens para a parte traseira da matriz se eles não existirem emsortingArr
:allProducts.sort((product1, product2) => { const index1 = manualSort.indexOf(product1.id); const index2 = manualSort.indexOf(product2.id); return ( (index1 > -1 ? index1 : Infinity) - (index2 > -1 ? index2 : Infinity) ); });
Se você usar a função de classificação de matriz nativa, poderá passar um comparador personalizado a ser usado ao classificar a matriz. O comparador deve retornar um número negativo se o primeiro valor for menor que o segundo, zero se forem iguais e um número positivo se o primeiro valor for maior.
Então, se eu entendo o exemplo que você está dando corretamente, você pode fazer algo como:
fonte
indexOf
retorna o primeiro índice.sortingArr
são únicos - que, felizmente, eles estão no meu caso :)sortingArray
fora da função para avoir re declarando-lo em cada iteração de classificaçãoCaso 1: Pergunta original (sem bibliotecas)
Muitas outras respostas que funcionam. :)
Caso 2: pergunta original (Lodash.js ou Underscore.js)
Caso 3: classificar Array1 como se fosse Array2
Eu estou supondo que a maioria das pessoas veio aqui procurando um equivalente ao array_multisort do PHP (eu fiz), então pensei em publicar essa resposta também. Existem algumas opções:
1. Existe uma implementação JS existente de array_multisort () . Obrigado a @Adnan por apontar nos comentários. É bem grande, no entanto.
2. Escreva o seu próprio. ( Demo do JSFiddle )
3. Lodash.js ou Underscore.js (bibliotecas menores e populares que se concentram no desempenho) oferecem funções auxiliares que permitem:
... Que (1) agrupa o sortArray em
[index, value]
pares, (2) classifica-os pelo valor (você também pode fornecer um retorno de chamada aqui), (3) substitui cada um dos pares pelo item do itemArray no índice par originado de.fonte
provavelmente é tarde demais, mas você também pode usar uma versão modificada do código abaixo no estilo ES6. Este código é para matrizes como:
A operação real:
A operação real no ES5:
Deve resultar em
arrayToBeSorted = [3,5]
Não destrói a matriz de referência.
fonte
[{name: "1"}, {name: "2"}, {name: "3"}, ...]
.Eu usaria um objeto intermediário (
itemsMap
), evitando assim a complexidade quadrática:Veja http://jsfiddle.net/eUskE/
fonte
http://jsfiddle.net/s7b2P/
Ordem resultante: Bob, Jason, Henry, Thomas, Anne, Andrew
fonte
Por que não algo como
A função de mapa pode não estar disponível em todas as versões do
Javascript
fonte
fonte
Isto é o que eu estava procurando e fiz para classificar uma matriz de matrizes com base em outra matriz:
fonte
Eu tive que fazer isso para uma carga JSON recebida de uma API, mas não estava na ordem que eu queria.
Matriz para ser a matriz de referência, aquela que você deseja que a segunda matriz seja classificada por:
Eu fiz isso como objetos, porque eles terão outras propriedades eventualmente.
Matriz criada:
Usado com o conjunto de resultados do banco de dados. Não sei o quão eficiente é, mas com o pequeno número de colunas que usei, funcionou bem.
fonte
Para obter uma nova matriz ordenada, você pode pegar
Map
e coletar todos os itens com a chave desejada em uma matriz e mapear as chaves ordenadas desejadas, utilizando o elemento peneirado do grupo desejado.fonte
{}
vez deMap
--️Esta solução anexará os objetos no final se a chave de classificação não estiver presente na matriz de referência
fonte
isso deve funcionar:
fonte
Você pode tentar este método.
fonte
ES6
Mais exemplos com diferentes matrizes de entrada
fonte
Caso você precise fazer isso com uma variedade de objetos, aqui está uma adaptação da incrível resposta de @Durgpal Singh:
fonte
Use o método $ .inArray () do jQuery. Você poderia fazer algo assim
fonte
Use a interseção de duas matrizes.
Ex:
=> ['a', 'b', 'e']
se 'z e' s 'estiverem fora do intervalo da primeira matriz, adicione-o no final do resultado
fonte
Você pode fazer algo assim:
Você pode testá-lo aqui .
Nota: isso pressupõe que as matrizes enviadas são equivalentes em tamanho; você precisará adicionar algumas verificações adicionais, se esse não for o caso.
link de referência
referir
fonte