Js matematik işlem sonucu NaN dönmesi
Merhaba ben aşağıda bulunan kodu yazınca çıktısı NaN olarak görünüyor. Çarpma işlemini yapmayı becremedim.
// useEffect(() => {
setTotal(
basket.map((acc, item) => {
return (
acc +
item.amount *
products.filter((product) => product.id === item.id).price
);
}, 0)
);
}, [basket]);
toplam: [object Object]NaN
Soru hatalı mı? 👎
Eğer sorunun kurallara aykırı olduğunu düşünüyorsanız lütfen bize bildirin!
Cevaplar (2)
sanirim reduce
kullanacaktın ama map
kullanmışsın :) aynı işlemi reduce
ile deneyebilirsin. Ve her ihtimale karşı filter'da bir şey dönüyor mu diye kontrol edebilirsin, çarpımı öncelik sırasında belirtebilirsin.
setTotal(
basket.reduce((acc, item) => {
return (
acc +
(item.amount * (products.filter((product) => product.id === item.id)?.price || 0))
);
}, 0)
);
"NaN" ifadesi ise, "Not a Number" anlamına gelir ve matematiksel bir işlem sonucunda hesaplanamayan bir değerin döndürüldüğünü gösterir. Bu hata genellikle, bir sayı ile bir olmayan sayısal değer (örneğin, bir dize veya bir nesne) arasında yapılan matematiksel bir işlemde oluşur.
Ancak, olası nedenler arasında şunlar yer alabilir:
- Bir değişkenin yanlış bir veri tipine sahip olması veya null/undefined değerleri taşıması
- Bir dizi veya nesne verisinin yanlış bir şekilde birleştirilmesi veya yazdırılması
- Bir toplama işlemi sırasında sayısal bir değerin NaN değeri döndürmesi
Öncelikle hatanın nereden kaynaklandığını belirlemeniz gerekir. Bunun için, aşağıdaki adımları takip edebilirsiniz:
- "basket" ve "products" array'lerinin doğru şekilde tanımlandığından emin olun.
- "setTotal" fonksiyonunun nasıl tanımlandığını ve "useState" hook'unun kullanıldığını kontrol edin. Ayrıca, "total" state değişkeninin başlangıç değerinin doğru şekilde belirtildiğinden emin olun.
- "map" fonksiyonunun doğru şekilde kullanıldığından emin olun. "map" fonksiyonu, iki parametre alır: bir fonksiyon ve bir başlangıç değeri. İlk parametre, "basket" array'inin her bir elemanı için çağrılan bir fonksiyondur. İkinci parametre, "map" fonksiyonunun başlangıç değeridir. Burada, başlangıç değeri olarak 0 kullanılmıştır, ancak bu doğru bir kullanım değildir. Çünkü, "map" fonksiyonunun ilk parametresi, toplam değer olarak kullanılan bir sayıya sahip olmalıdır.
- "map" fonksiyonu içindeki fonksiyonun doğru şekilde kullanıldığından emin olun. İlk parametre, "acc" olarak adlandırılan bir akümülatör değeridir. Bu değer, her bir elemanın işleminin sonucunu saklamak için kullanılır. İkinci parametre, "item" olarak adlandırılan, "basket" array'inin her bir elemanıdır. Bu iki parametrenin doğru şekilde kullanıldığından emin olun.
- "products" array'indeki fiyatların doğru şekilde belirtildiğinden emin olun. Bu array'de, her bir ürünün "id" ve "price" özellikleri olmalıdır. Bu özelliklerin doğru şekilde tanımlandığından ve her bir ürün için benzersiz bir "id" değeri olduğundan emin olun.