125 votes

Pourquoi JavaScript n'a-t-il pas une dernière méthode ?

Il est assez étrange que la classe JavaScript Array ne propose pas de méthode pour récupérer le dernier élément d'un tableau. Je sais que la solution est simple (Ar[Ar.length-1] ), mais, malgré tout, cette méthode est trop fréquemment utilisée.

Y a-t-il des raisons sérieuses pour lesquelles cela n'est pas encore incorporé ?

39 votes

Pour les cas où cela ne vous dérange pas de modifier le tableau comme effet secondaire (c'est-à-dire lorsque le tableau n'est que temporaire de toute façon), l'idiome serait le suivant item= array.pop(); .

7 votes

Voici une évaluation des performances de plusieurs des méthodes mentionnées : jsperf.com/get-last-item-from-array

5 votes

Bon sang, après avoir regardé cette page de perf, il semble que array[array.length-1] es chemin plus rapidement que les autres.

265voto

Álvaro G. Vicario Points 57607

Vous pouvez faire quelque chose comme ça :

[10, 20, 30, 40].slice(-1)[0]

console.log([10, 20, 30, 40].slice(-1)[0])

La quantité de méthodes d'aide qui peuvent être ajoutées à un langage est infinie. Je suppose qu'ils n'ont pas envisagé d'ajouter celle-ci.

11 votes

Tenté par un downvote pour "proche de l'infini".

11 votes

Pourquoi ? Vous pouvez vous approcher autant que vous voulez, sans limite :)

35 votes

Celui-ci devrait être la réponse.

82voto

Anurag Points 66470

Il est facile d'en définir un soi-même. C'est la puissance de JavaScript.

if(!Array.prototype.last) {
    Array.prototype.last = function() {
        return this[this.length - 1];
    }
}

var arr = [1, 2, 5];
arr.last(); // 5

Cependant, cela peut causer des problèmes avec du code tiers qui utilise (de manière incorrecte) for..in boucles pour itérer sur des tableaux.

Cependant, si vous n'êtes pas lié à Support du navigateur puis en utilisant la nouvelle syntaxe ES5 pour définir les propriétés peut résoudre ce problème, en rendant la fonction non dénombrable, comme suit :

Object.defineProperty(Array.prototype, 'last', {
    enumerable: false,
    configurable: true,
    get: function() {
        return this[this.length - 1];
    },
    set: undefined
});

var arr = [1, 2, 5];
arr.last; // 5

11 votes

Notez que l'ajout de propriétés au prototype de Array peut casser le code où for..in est utilisé pour itérer sur un tableau. L'utilisation de for..in pour itérer un tableau est une mauvaise pratique, mais elle est suffisamment courante pour que la modification du prototype de Array le soit également. En général, les prototypes d'Object, Array, String, Number, Boolean et Date ne doivent pas être modifiés si votre script doit fonctionner avec un autre code inconnu.

7 votes

@no - Merci pour le conseil. J'aurais dû mentionner que la raison de l'ajout de la syntaxe ES5 avec l'énumérabilité définie à false était précisément de résoudre le problème de l'utilisation de l'en-tête. for..in problème. Certes, nous n'en sommes pas encore là avec une mise en œuvre étendue de l'ES5, mais il est bon de le savoir maintenant, car les navigateurs le rattrapent rapidement, y compris IE9.

4 votes

Pour les listes vides, this.length - 1 évalue à -1 qui, parce qu'il s'agit d'un nombre négatif, est traité comme une propriété du tableau et non comme un indice d'élément.

38voto

Triptych Points 70247

Parce que Javascript change très lentement. Et c'est parce que les gens mettent à jour leurs navigateurs lentement.

De nombreuses bibliothèques Javascript implémentent leur propre last() fonction. Utilisez-en une !

21 votes

À tout le moins, vous pourriez envisager de suggérer une bibliothèque qui fournirait l'implémentation. Par exemple, Underscore.js est un bon choix. Voir documentcloud.github.com/underscore/#last

11 votes

@Sean - J'ai pensé ne pas recommander une bibliothèque Javascript particulière à l'auteur du message. Google fait un assez bon travail pour évaluer l'opinion collective du web sur la bibliothèque à utiliser. Pourquoi en recommanderais-je une en particulier ? En effet, pourquoi avez-vous recommandé underscore.js, qui me semble très au goût du jour à première vue ?

7 votes

Je préfère en fait la réponse ci-dessous qui consiste à implémenter la fonction en dehors d'une bibliothèque. Cela dit, étant donné que je suis tombé sur cette question par hasard via Google, je suggérais que la première réponse aide les autres à poursuivre leur recherche d'une solution plutôt que de les renvoyer vers le bouton retour.

26voto

GRIGORE-TURBODISEL Points 4415

i = [].concat(loves).pop(); //corn

le chat icône aime le pop-corn

15 votes

Attention : ceci crée une copie de la liste entière juste pour faire sauter un élément. C'est une perte potentielle de temps et d'espace. Ne le faites pas.

13voto

Riviera Points 323

Une autre option, surtout si vous utilisez déjà UnderscoreJS, serait :

_.last([1, 2, 3, 4]); // Will return 4

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X