J'ai un tableau d'objets avec plusieurs paires de valeurs clés, et je dois les trier en fonction de 'updated_at':
[
{
"updated_at" : "2012-01-01T06:25:24Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-09T11:25:13Z",
"foo" : "bar"
},
{
"updated_at" : "2012-01-05T04:13:24Z",
"foo" : "bar"
}
]
Quelle est la manière la plus efficace de le faire?
javascript
arrays
object
monstre cookie
la source
la source
Réponses:
Vous pouvez utiliser
Array.sort
.Voici un exemple:
la source
keyA - keyB
(ou éventuellementkeyB - keyA
)? Les objets de date ont unevalueOf()
méthode.a-b
est vraiment importante si vous voulez éviter le code long. Bien que le code long ne soit pas nécessairement mauvais dans ce cas, je pense que la verbosité le rend plus difficile à comprendre. J'utilise actuellementvalues.sort((a,b)=>a.attr-b.attr)
. Devoir écrire 5 lignes chaque fois que vous devez trier un tableau devient fastidieux.J'ai déjà répondu à une question vraiment similaire ici: Fonction simple pour trier un tableau d'objets
Pour cette question, j'ai créé cette petite fonction qui pourrait faire ce que vous voulez:
la source
-1
:)array = array.reverse()
fonction.La méthode Array.sort () trie les éléments d'un tableau en place et retourne le tableau. Soyez prudent avec Array.sort () car il n'est pas immuable . Pour le tri immuable, utilisez immuable-sort .
Cette méthode consiste à trier le tableau en utilisant votre courant
updated_at
au format ISO. Nous utilisonsnew Data(iso_string).getTime()
pour convertir le temps ISO en horodatage Unix. Un horodatage Unix est un nombre sur lequel nous pouvons faire des calculs simples. Nous soustrayons le premier et le deuxième horodatage du résultat; si le premier horodatage est plus grand que le second, le numéro de retour sera positif. Si le deuxième nombre est plus grand que le premier, la valeur de retour sera négative. Si les deux sont identiques, le retour sera nul. Cela correspond parfaitement aux valeurs de retour requises pour la fonction inline.Pour ES6 :
Pour ES5 :
Si vous modifiez vos
updated_at
horodatages Unix, vous pouvez le faire:Pour ES6 :
Pour ES5 :
Au moment de cette publication, les navigateurs modernes ne prennent pas en charge ES6. Pour utiliser ES6 dans les navigateurs modernes, utilisez babel pour transpiler le code en ES5. Attendez-vous à la prise en charge du navigateur pour ES6 dans un avenir proche.
Array.sort () devrait récupérer une valeur de retour de l'un des 3 résultats possibles:
Pour le tri immuable: (exemple dans ES6)
Vous pouvez également l'écrire de cette façon:
L'import-from you see est une nouvelle façon d'inclure javascript dans ES6 et rend votre code très propre. Mon préféré.
Le tri immuable ne mute pas le tableau source mais renvoie un nouveau tableau. L'utilisation
const
est recommandée sur les données immuables.la source
Voici une version légèrement modifiée de la réponse @David Brainer-Bankers qui trie alphabétiquement par chaîne ou numériquement par numéro, et garantit que les mots commençant par des majuscules ne trient pas les mots commençant par une minuscule (par exemple "pomme, précoce" serait affiché dans cet ordre).
la source
Utilisez le j de soulignement ou le lodash,
_.sortBy()
renvoie un nouveau tableauconsultez http://underscorejs.org/#sortBy et lodash docs https://lodash.com/docs#sortBy
la source
Avec le support ES2015, cela peut être fait par:
la source
new Date(iso_str).getTime()
cela retournera un horodatage Unix.Données importées
POUR ordre croissant
Exemple pour l'ordre Asc
POUR ordre décroissant
Exemple d'ordre Desc
la source
Comme l'indique cette réponse, vous pouvez utiliser
Array.sort
.arr.sort(function(a,b){return new Date(a.updated_at) - new Date(b.updated_at)})
la source
Juste une autre façon, plus mathématique , de faire la même chose mais plus court :
ou dans le style de flèche lambda lisse:
Cette méthode peut être effectuée avec n'importe quelle entrée numérique
la source
En ce qui concerne aujourd'hui, les réponses de @knowbody ( https://stackoverflow.com/a/42418963/6778546 ) et @Rocket Hazmat ( https://stackoverflow.com/a/8837511/6778546 ) peuvent être combinées pour fournir un support ES2015 et gestion correcte des dates:
la source
J'ai créé une fonction de tri dans Typescript que nous pouvons utiliser pour rechercher des chaînes, des dates et des nombres dans un tableau d'objets. Il peut également trier sur plusieurs champs.
Usage:
la source
Le tri par date au format ISO peut être coûteux, sauf si vous limitez les clients aux navigateurs les plus récents et les meilleurs, qui peuvent créer l'horodatage correct en analysant la chaîne par date.
Si vous êtes sûr de votre saisie et que vous savez que ce sera toujours aaaa-mm-jjThh: mm: ss et GMT (Z), vous pouvez extraire les chiffres de chaque membre et les comparer comme des nombres entiers
Si la date peut être formatée différemment, vous devrez peut-être ajouter quelque chose pour les personnes ayant un défi iso:
la source
Date.parse
?Pour être complet, voici une implémentation générique courte possible de sortBy:
Notez que cela utilise la méthode de tri des tableaux qui trie sur place. pour une copie, vous pouvez utiliser arr.concat () ou arr.slice (0) ou une méthode similaire pour créer une copie.
la source
Avec cela, nous pouvons passer une fonction clé à utiliser pour le tri
Ensuite, par exemple, si nous avons
Nous pouvons faire
ou
ou
la source
Vous pouvez utiliser la bibliothèque d'utilitaires Lodash pour résoudre ce problème (c'est une bibliothèque assez efficace):
Vous pouvez trouver de la documentation ici: https://lodash.com/docs/4.17.15#orderBy
la source
Vous pouvez créer une fermeture et la passer de cette façon voici mon exemple de travail
la source
la source
Array.sort()
pour trier un tableau…
) pour rendre la fonction pureupdated_at
)Array.sort()
fonctionne en soustrayant deux propriétés de l'élément actuel et suivant s'il s'agit d'un nombre / objet sur lequel vous pouvez effectuer des opérations arythmiquesla source
Je fais face à la même chose, donc je gère cela avec un pourquoi générique et je crée une fonction pour cela:
la source