Jak naprawić object.map nie jest funkcją Błąd w JavaScript

Opublikowany: 2022-04-10

Wyobraź sobie: masz skonfigurowane i działające wywołanie API. Dane wracają zgodnie z oczekiwaniami. Teraz? Czas na pracę z tymi danymi, aby stworzyć rozwiązanie, którego szukasz. Nagle widzisz błąd w konsoli.

object-map-is-not-a-function-image

Co się stało i dlaczego ten object.map is not a function ? Czytaj dalej, aby się dowiedzieć.

Problem

Przyczyna błędu jest w rzeczywistości dość prosta: metoda .map() ma zastosowanie tylko podczas pracy z tablicami. Mówiąc dokładniej, metoda istnieje w prototypie Array jako Array.prototype.map() .

Ta metoda została pierwotnie wprowadzona w 2009 roku w ES5 i jest bardzo przydatna w wielu scenariuszach. Array.map() przyjmuje funkcję zwrotną jako jedyny parametr. To wywołanie zwrotne ma dwa parametry: bieżący element i jego indeks w tablicy. Sama metoda działa podobnie do wywołania Array.forEach() , z wyjątkiem tego, że wartości zwracane przez wywołanie zwrotne są umieszczane razem w nowej tablicy, która jest zwracana przez samą metodę.

Tworzenie nowej tablicy z danej tablicy jest sposobem na zachowanie niezmienności w kodzie JavaScript. Należy zauważyć, że jeśli używasz Array.map() na tablicy obiektów i zmieniasz właściwość na danym obiekcie, obiekt ten został zmutowany. Aby tego uniknąć, możesz najpierw utworzyć kopię obiektu, a następnie zmodyfikować kopię.

Na przykład, jeśli masz tablicę liczb i chcesz utworzyć nową tablicę, w której każda liczba w oryginalnej tablicy jest podwojona, możesz po prostu zrobić to:

const items = [ 1 , 2 , 3 ]; // ES5 approach const doubledItems = items.map( function ( item ) { return item * 2 ; }); // ES6+ approach const doubledItems = items.map( ( item ) => { return item * 2 ; }); // Least code approach const doubledItems = items.map( ( item ) => item * 2 ); console .log(doubledItems); // [2, 4, 6]
Język kodu: JavaScript ( javascript )

Rozwiązanie

Aby rozwiązać object.map is not a function , najpierw ustal kształt danych, z którymi pracujesz, a następnie utwórz tablicę z tych danych w zależności od tego, jakie są dane. Na przykład, może twoje dane są prostym obiektem, ale szukana tablica znajduje się w rzeczywistości w tym obiekcie. W takim przypadku po prostu użyj notacji z kropkami, aby uzyskać dostęp do żądanej właściwości:

const object = { items : [ { id : 1 , data : "item 1 data" , }, { id : 2 , data : "item 2 data" , }, ], }; const error = object.map( ( item ) => item.data); // This will cause your error! // Instead, map over the items property rather than the parent object const result = object.items.map( ( item ) => item.data); console .log(result); // ["item 1 data", "item 2 data"]
Język kodu: JavaScript ( javascript )

Możliwe jest również, że Twoje dane są prostym obiektem, ale dane, nad którymi chcesz iterować, są przechowywane w każdym kluczu obiektu. W takim przypadku możesz przejść przez te klucze i wykonać logikę na odpowiedniej wartości każdego klucza:

const object = { 1 : { id : "1" , data : "item 1 data" , }, 2 : { id : "2" , data : "item 2 data" , }, }; const error = object.map( ( item ) => item.data); // This will cause your error! // Get an array of the keys in your object const array = Object .keys(object); // [1, 2] // Loop through that array using each key to get the value const result = array.map( ( key ) => { const value = object[key]; // Perform your desired logic here then return a new value return value.data; }); console .log(result); // ["item 1 data", "item 2 data"]
Język kodu: JavaScript ( javascript )

Inne popularne rozwiązanie jest potrzebne podczas pracy z Set JavaScript lub Map . Ponieważ obie są iterowalne, a nawet mają .forEach() , można rozsądnie założyć, że .map() również zadziała. Ponieważ technicznie nie są to tablice, będziesz potrzebować obejścia. Rozwiązanie jest podobne zarówno dla Set , jak i Map , a nawet mamy artykuł, który bardziej szczegółowo wyjaśnia, jak pracować z ich wartościami, który możesz zobaczyć tutaj.

// --- Map solution example --- const myMap = new Map (); myMap.set( 1 , "item 1 data" ); myMap.set( 2 , "item 2 data" ); const myMapError = myMap.map(); // This will cause your error! // Create an array from the values of the Map const myMapArray = [...myMap.values()]; const myMapResult = myMapArray.map( ( item ) => { // Perform your logic here if (item) { return item; } }); console .log(myMapResult); // ["item 1 data", "item 2 data"] // --- Set solution example --- const mySet = new Set (); mySet.add( "item 1 data" ); mySet.add( "item 2 data" ); // Since set values are unique this won't be added to the Set mySet.add( "item 2 data" ); const mySetError = mySet.map(); // This will cause your error! const mySetArray = [...mySet.values()]; const mySetResult = mySetArray.map( ( item ) => { // Perform your logic here if (item) { return item; } }); console .log(mySetResult); // ["item 1 data", "item 2 data"]
Język kodu: JavaScript ( javascript )

Jeśli chcesz uniknąć błędu w przyszłości, zwłaszcza jeśli nie znasz dokładnego kształtu danych, na których będziesz próbował wywołać Array.map() , oto prosta funkcja do bezpiecznego mapowania wartości tablicy:

const safelyMap = ( data, callback ) => { if (!(data && Array .isArray(data))) { return []; } return data.map(callback); }; // Arbitrary callback function const callback = ( item ) => item; console .log(safelyMap( null , callback)); // [] console .log(safelyMap( new Set (), callback)); // [] console .log(safelyMap([ 1 , 2 , 3 ], callback)); // [1, 2, 3]
Język kodu: JavaScript ( javascript )

Mam nadzieję, że jedno z tych rozwiązań rozwiąże Twój konkretny przypadek, ale jeśli nie, zostaw komentarz, a chętnie Ci pomożemy.

Kodeks Izotropowy to zbiór fragmentów kodu i materiałów edukacyjnych dla programistów WordPress, stron internetowych i WooCommerce.
Bibliografia
Subskrybuj i udostępniaj
Jeśli spodobała Ci się ta treść, zasubskrybuj nasz comiesięczny przegląd wiadomości WordPress, inspiracji do stron internetowych, ekskluzywnych ofert i interesujących artykułów.
Zrezygnuj z subskrypcji w dowolnym momencie. Nie spamujemy i nigdy nie będziemy sprzedawać ani udostępniać Twojego e-maila.