Στη JavaScript, η κλάση Array έχει πολλές ισχυρές ενσωματωμένες μεθόδους για τον μετασχηματισμό πινάκων.
Αυτές οι μέθοδοι κάνουν τη μετατροπή ενός πίνακα σε έναν άλλο πολύ πιο εύκολη απ' ό,τι θα ήταν με έναν απλό βρόχο for ή με πιο άμεσο χειρισμό.
Κάποιες μέθοδοι είναι καθαρές, δηλαδή δεν τροποποιούν τον αρχικό πίνακα. Επιστρέφουν αντ' αυτού έναν νέο πίνακα. Άλλες μέθοδοι όμως χειρίζονται τον πίνακα στον οποίο καλούνται και δεν επιστρέφουν τον τροποποιημένο πίνακα.
Μερικές από τις πιο συχνά χρησιμοποιούμενες μεθόδους για τον μετασχηματισμό πινάκων παρουσιάζονται παρακάτω. Μια πλήρης λίστα των διαθέσιμων μεθόδων υπάρχει στην τεκμηρίωση του MDN.
Δημιουργεί έναν νέο πίνακα μετασχηματίζοντας κάθε στοιχείο σύμφωνα με μια συνάρτηση που περνάει ως όρισμα. Αυτές οι συναρτήσεις callback γράφονται συχνά ως συναρτήσεις βέλους.
let arr = [1, 2, 3, 4];
const newArr = arr.map((value) => value - 1);
console.log(newArr);
// => [0, 1, 2, 3]
console.log(arr);
// => [1, 2, 3, 4]
Αξίζει να σημειωθεί ότι ο πίνακας που προκύπτει θα έχει πάντα το ίδιο μήκος με τον αρχικό.
Δημιουργεί έναν πίνακα φιλτράροντας τον τρέχοντα, με βάση μια συνάρτηση φιλτραρίσματος (που επιστρέφει αληθής αν το στοιχείο πρέπει να κρατηθεί και ψευδής αν πρέπει να αφαιρεθεί).
let arr = [1, 2, 3, 4];
arr.filter((value) => value % 2 === 0);
// => [2, 4]
Μειώνει τον πίνακα σε μία μόνο τιμή χρησιμοποιώντας μια συνάρτηση που δέχεται ως παραμέτρους έναν συσσωρευτή και το τρέχον στοιχείο του πίνακα. Αυτή η συνάρτηση καθορίζει πώς το τρέχον στοιχείο πρέπει να ενσωματωθεί στον συσσωρευτή και επιστρέφει τον συσσωρευτή που θα χρησιμοποιηθεί στην επόμενη επανάληψη.
let arr = [1, 2, 3, 4];
// Get the sum of elements
arr.reduce((accumulator, currentValue) => accumulator + currentValue, 0);
// => 10
// Classify the numbers by whether they are odd or not
arr.reduce(
(accumulator, currentValue) => {
if (currentValue % 2 === 0) {
accumulator.even.push(currentValue);
} else {
accumulator.odd.push(currentValue);
}
return accumulator;
},
{ even: [], odd: [] },
);
// => { even: [2, 4], odd: [1, 3] }
Αντιστρέφει τα στοιχεία ενός πίνακα.
const arr = [1, 2, 3, 4];
arr.reverse();
// => [4, 3, 2, 1]
Αυτή η μέθοδος τροποποιεί τον πίνακα στον οποίο καλείται.
Δεδομένης μιας θέσης έναρξης και μιας θέσης τέλους, δημιουργεί έναν υποπίνακα από τον πίνακα στον οποίο καλείται.
Το στοιχείο στη θέση τέλους δεν θα συμπεριληφθεί.
Επίσης, όλες οι παράμετροι είναι προαιρετικές:
η θέση έναρξης έχει προεπιλεγμένη τιμή 0, και η θέση τέλους έχει προεπιλογή το μήκος του πίνακα.
const arr = [1, 2, 3, 4];
arr.slice(1, 2); // [2]
arr.slice(1); // [2, 3, 4]
// You can also use negative numbers, that represent the indexes
// starting from the end of the array
arr.slice(-2); // [3, 4]
Αφαιρεί ή αντικαθιστά ή/και προσθέτει νέα στοιχεία ενός πίνακα. Δέχεται τις εξής παραμέτρους:
Το splice επιστρέφει τα στοιχεία που αφαιρέθηκαν.
const arr = ['1', '2', '5', '6'];
// Insert an element at index 2
arr.splice(2, 0, '3');
console.log(arr);
// => ['1', '2', '3', '5', '6']
// Remove 2 elements, starting at index 3 and insert 2 elements
const removed = arr.splice(3, 2, '4', '5');
console.log(removed);
// => ['5', '6']
console.log(arr);
// => ['1', '2', '3', '4', '5']
// Remove 1 element at index 1
arr.splice(1, 1);
console.log(arr);
// => ['1', '3', '4', '5']
Από προεπιλογή, το sort ταξινομεί τα στοιχεία ενός πίνακα μετατρέποντάς τα πρώτα σε συμβολοσειρές και εφαρμόζοντας μετά σύγκριση συμβολοσειρών (δείτε τη Σύγκριση).
Η ταξινόμηση γίνεται in-place, που σημαίνει ότι ο αρχικός πίνακας τροποποιείται.
Το sort επιστρέφει επίσης αυτόν τον τροποποιημένο πίνακα, κάτι που είναι βολικό αν θέλεις να αλυσιδώσεις κι άλλες μεθόδους πάνω του.
const arr = ['c', 'a', 'z', 'b'];
const result = arr.sort();
console.log(result);
// => ['a', 'b', 'c', 'z']
console.log(arr);
// => ['a', 'b', 'c', 'z']
Αυτή η προεπιλεγμένη συμπεριφορά οδηγεί σε λανθασμένα αποτελέσματα όταν προσπαθείς να ταξινομήσεις αριθμούς.
const arr = [3, 1, 2, 10];
arr.sort();
// => [1, 10, 2, 3]
// Because the string '10' comes before '2' in dictionary order.
Για να προσαρμόσεις τη συμπεριφορά της ταξινόμησης, μπορείς να περάσεις μια συνάρτηση σύγκρισης ως όρισμα. Η ίδια η συνάρτηση σύγκρισης καλείται με δύο ορίσματα, που είναι δύο στοιχεία του πίνακα. Στη συνέχεια πρέπει να επιστρέψει τα εξής:
0 αν η σειρά των στοιχείων πρέπει να παραμείνει ίδιαΈτσι, το πρόβλημα της ταξινόμησης αριθμών μπορεί να διορθωθεί περνώντας τη σωστή συνάρτηση σύγκρισης.
const arr = [3, 1, 2, 10];
arr.sort((a, b) => a - b);
// => [1, 2, 3, 10]
// "a - b" is negative when b is greater than a, positive when
// a is greater than b and 0 when they are equal.
Ορίστε ένα παράδειγμα για το πώς μπορεί να χρησιμοποιηθεί μια προσαρμοσμένη συνάρτηση σύγκρισης για να ταξινομήσεις έναν πίνακα αντικειμένων.
const arr = [
{ name: 'Lydia', age: 7 },
{ name: 'Anne', age: 34 },
{ name: 'Holger', age: 59 },
];
arr.sort((item1, item2) => {
if (item1.name < item2.name) {
return -1;
}
if (item1.name > item2.name) {
return 1;
}
return 0;
});
// => [ { name: 'Anne', age: 34 }, { name: 'Holger', age: 59 },
// { name: 'Lydia', age: 7 } ]
Από το 2019, η προδιαγραφή της γλώσσας ορίζει ότι η ταξινόμηση πρέπει να είναι σταθερή, αλλά δεν υπάρχουν εγγυήσεις σχετικά με την απόδοση (χρονική και χωρική πολυπλοκότητα).