Object.map bir fonksiyon değildir Nasıl Düzeltilir JavaScript'te Hata

Yayınlanan: 2022-04-10

Şunu hayal edin: API çağrı kurulumunuz ve çalışmanız var. Veriler beklediğiniz gibi geri gelir. Şimdi? Aradığınız çözümü oluşturmak için bu verilerle çalışma zamanı. Birden konsolunuzda bir hata görüyorsunuz.

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

Ne oldu ve neden bu object.map is not a function görüyorsunuz? Öğrenmek için okumaya devam edin.

Sorun

Hatanızın nedeni aslında oldukça basit: .map() yöntemi yalnızca dizilerle çalışırken geçerlidir. Daha spesifik olarak, yöntem Array prototipinde Array.prototype.map() olarak bulunur.

Bu yöntem ilk olarak 2009'da ES5 ile tanıtıldı ve birçok senaryoda çok kullanışlıdır. Array.map() , tek ve tek parametresi olarak bir geri çağırma işlevi alır. Bu geri aramaya iki parametre verilir: geçerli öğe ve dizideki dizini. Yöntemin kendisi, geri çağırmanın dönüş değerlerinin yöntemin kendisi tarafından döndürülen yeni bir dizide bir araya getirilmesi dışında, Array.forEach() i çağırmaya benzer şekilde çalışır.

Belirli bir diziden yeni bir dizi oluşturmak , JavaScript kodunuzda değişmezliği korumanın bir yoludur. Bir dizi nesne üzerinde Array.map() kullanıyorsanız ve belirli bir nesnede bir özelliği değiştirirseniz, o nesnenin artık mutasyona uğradığını unutmamak önemlidir . Bunu önlemek için önce nesnenin bir kopyasını oluşturabilir ve ardından kopyayı değiştirebilirsiniz.

Örneğin, bir sayı diziniz varsa ve orijinal dizideki her sayının iki katına çıktığı yeni bir dizi oluşturmak istiyorsanız, şunu yapabilirsiniz:

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]
Kod dili: JavaScript ( javascript )

Çözüm

object.map is not a function çözmek için, önce üzerinde çalıştığınız verinin şeklini bulun ve ardından verinin ne olduğuna bağlı olarak bu verilerden bir dizi oluşturun. Örneğin, verileriniz basit bir nesne olabilir ancak aradığınız dizi aslında o nesnenin içindedir. Bu durumda, istenen özelliğe erişmek için nokta gösterimini kullanmanız yeterlidir:

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"]
Kod dili: JavaScript ( javascript )

Verilerinizin basit bir nesne olması da mümkündür, ancak yinelemek istediğiniz veriler nesnenin her anahtarında saklanır. Bu durumda, bu anahtarlar arasında dolaşabilir ve mantığınızı her bir anahtarın ilgili değerinde gerçekleştirebilirsiniz:

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"]
Kod dili: JavaScript ( javascript )

Bir JavaScript Set veya Map ile çalışırken başka bir ortak çözüm gerekir. Bunların her ikisi de yinelenebilir olduğundan ve hatta bir .forEach() yöntemine sahip olduklarından, makul bir şekilde .map() öğesinin de işe yarayacağını varsayabilirsiniz. Teknik olarak dizi olmadıkları için, bir geçici çözüme ihtiyacınız olacak. Çözüm, hem Set hem de Map için benzerdir ve burada görüntüleyebileceğiniz, değerleriyle nasıl çalışılacağını daha ayrıntılı olarak açıklayan bir makalemiz bile var.

// --- 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"]
Kod dili: JavaScript ( javascript )

Gelecekte bu hatayı önlemek istiyorsanız, özellikle Array.map() üzerinde çağırmaya çalışacağınız verilerin tam şeklini bilmiyorsanız, bir dizinin değerlerini güvenli bir şekilde eşlemek için basit bir fonksiyon aşağıda verilmiştir:

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]
Kod dili: JavaScript ( javascript )

Umarım bu çözümlerden biri özel durumunuzu çözer, ancak değilse, lütfen bir yorum bırakın ve size yardımcı olmaktan memnuniyet duyarız.

İzotropik Kodeks, WordPress, web ve WooCommerce geliştiricileri için bir kod parçacıkları ve eğitim koleksiyonudur.
Referanslar
Abone Ol ve Paylaş
Bu içeriği beğendiyseniz, aylık WordPress haberleri, web sitesi ilhamı, özel fırsatlar ve ilginç makalelere abone olun.
İstediğiniz zaman abonelikten çıkın. Spam yapmıyoruz ve e-postanızı asla satmayacağız veya paylaşmayacağız.