Ποιος είναι ο πιο συνοπτικός και αποτελεσματικός τρόπος για να διαπιστώσετε αν ένας πίνακας JavaScript περιέχει μια τιμή;
Αυτός είναι ο μόνος τρόπος που ξέρω να το κάνω:
function contains(a, obj) {
for (var i = 0; i < a.length; i++) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Υπάρχει κάποιος καλύτερος και πιο συνοπτικός τρόπος για να το πετύχετε αυτό;
Αυτό σχετίζεται πολύ στενά με την ερώτηση του Stack Overflow Best way to find an item in a JavaScript Array? η οποία αφορά την εύρεση αντικειμένων σε έναν πίνακα χρησιμοποιώντας το indexOf
.
Ενημέρωση από το 2019: Αυτή η απάντηση είναι από το 2008 (11 ετών!) και δεν είναι σχετική με τη σύγχρονη χρήση του JS. Η υποσχόμενη βελτίωση των επιδόσεων βασίστηκε σε ένα benchmark που έγινε σε browsers εκείνης της εποχής. Μπορεί να μην είναι σχετική με τα σύγχρονα πλαίσια εκτέλεσης JS. Αν χρειάζεστε μια εύκολη λύση, αναζητήστε άλλες απαντήσεις. Αν χρειάζεστε τις καλύτερες επιδόσεις, κάντε μόνοι σας συγκριτική αξιολόγηση στα σχετικά περιβάλλοντα εκτέλεσης.
Όπως είπαν και άλλοι, η επανάληψη μέσω του πίνακα είναι πιθανώς ο καλύτερος τρόπος, αλλά έχει αποδειχθεί ότι ένας φθίνων βρόχος while
είναι ο ταχύτερος τρόπος επανάληψης στην JavaScript. Έτσι, ίσως να θέλετε να ξαναγράψετε τον κώδικά σας ως εξής:
function contains(a, obj) {
var i = a.length;
while (i--) {
if (a[i] === obj) {
return true;
}
}
return false;
}
Φυσικά, μπορείτε κάλλιστα να επεκτείνετε το πρωτότυπο Array:
Array.prototype.contains = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
Και τώρα μπορείτε απλά να χρησιμοποιήσετε το εξής:
alert([1, 2, 3].contains(2)); // => true
alert([1, 2, 3].contains('2')); // => false
indexOf
ίσως, αλλά πρόκειται για μια "επέκταση της JavaScript στο πρότυπο ECMA-262- ως εκ τούτου μπορεί να μην υπάρχει σε άλλες υλοποιήσεις του προτύπου.",
Παράδειγμα:
[1, 2, 3].indexOf(1) => 0
["foo", "bar", "baz"].indexOf("bar") => 1
[1, 2, 3].indexOf(4) => -1
AFAICS η Microsoft δεν προσφέρει κάποιο είδος εναλλακτικής λύσης σε αυτό, αλλά μπορείτε να προσθέσετε παρόμοια λειτουργικότητα στους πίνακες στον Internet Explorer (και σε άλλους browsers που δεν υποστηρίζουν το indexOf
) αν θέλετε, όπως αποκαλύπτει μια γρήγορη αναζήτηση στο Google (για παράδειγμα, αυτό εδώ).
Εάν χρησιμοποιείτε JavaScript 1.6 ή νεότερη έκδοση (Firefox 1.5 ή νεότερη έκδοση) μπορείτε να χρησιμοποιήσετε Array.indexOf. Διαφορετικά, νομίζω ότι θα καταλήξετε σε κάτι παρόμοιο με τον αρχικό σας κώδικα.