data.map bir işlev değil


110

Nasıl düzelteceğimi bilemediğim bir hataya kafamı vuruyorum. Aşağıdakilere sahibim;

JSON

{"products":
[
    {
        "product_id" : "123",
        "product_data" : {
            "image_id" : "1234",
            "text" : "foo",
            "link" : "bar",
            "image_url" : "baz"
        }
    },{
        "product_id" : "456",
        "product_data" : {
            "image_id" : "1234",
            "text" : "foo",
            "link" : "bar",
            "image_url" : "baz"
        }
    }
]}

ve aşağıdaki jQuery

function getData(data) {
    this.productID = data.product_id;
    this.productData = data.product_data;
    this.imageID = data.product_data.image_id;
    this.text = data.product_data.text;
    this.link = data.product_data.link;
    this.imageUrl = data.product_data.image_url;
}

$.getJSON("json/products.json").done(function (data) {

    var allProducts = data.map(function (item) {
        return new getData(item);
    });
});

yine de map.data'nın bir işlev olarak tanımlanmamış olduğuna dair bir hata alıyorum? Baktığımda neyin işe yaramadığını bilmiyorum çünkü bunu daha önce kullanılan koddan yeni bir projeye kopyaladım. Farklı olan tek şey JSON kaynağıdır. Bir önceki {"products":bölümde [] parantezlerden önceki kısım yoktu . Beni sinirlendiren bu mu?


72
Artık başını bash etmeyin - biz bunun üstesinden geleceğiz ...
Mark C.

map.data veya data.map?
depperm

Yanıtlar:


190

Nesneler, {}JavaScript'te yönteme sahip değildir .map(). Bu sadece bu Diziler , [].

Yani kodunuzun çalışması data.map()için, data.products.map()çünkü productsüzerinde yineleyebileceğiniz bir dizi vardır.


iwow işe yarıyor, çok teşekkürler, verilerden önce bir satırda aynı sorunları yaşadım
Anoop PS,

64

Nesneler üzerinde yinelemenin doğru yolu,

Object.keys(someObject).map(function(item)...
Object.keys(someObject).forEach(function(item)...;

// ES way
Object.keys(data).map(item => {...});
Object.keys(data).forEach(item => {...});

Ayrıntılar için burayı okuyun


10
bazen anahtarlar değil de değerler arıyor olabilirsiniz: anahtarlar> Nesne.values ​​(someObject) .map (function (öğe) ... // tuşlar yerine
Ram

7

En basit cevap koymaktır "veriler" köşeli bir çift halinde (yani, [verileri] ):

     $.getJSON("json/products.json").done(function (data) {

         var allProducts = [data].map(function (item) {
             return new getData(item);
         });

     });

Burada [veriler] bir dizidir ve üzerinde ".map" metodu kullanılabilir. Benim için çalışıyor! görüntü açıklamasını buraya girin


Bu, yalnızca bir veri öğesi olan orijinal nesneniz olan yeni bir dizi oluşturmaz mı? Neden haritaya ihtiyacınız var? var data = {foo: 'bar'}; [data].map(function (item) { console.log(item); });
EpicVoyage

Evet, yalnızca bir veri öğesi ile yeni bir dizi oluşturur. Bunda yanlış bir şey yok. Haritaya ihtiyacı olan ben değilim. Haritalanması gereken belirli bir proje. Eşlemesi gerekiyorsa ancak verileriniz bir dizi değilse, bir hata olacaktır. Onu bir diziye dönüştürmek, değerlerini değil biçimini değiştirir ve bu da projenin ihtiyacı olan şeydir.
William Hou

Bir şey eksik olabilir. Bana öyle geliyor ki sizin örneğiniz harita olmadan aynı şeyi yapacak:$.getJSON("json/products.json").done(function (data) { var allProducts = new getData(data); });
EpicVoyage

Özgün cevabım çok, çok, çok basit - sadece verileri bir diziye dönüştürmek, böylece YALNIZCA "data.map bir işlev değildir" hatası DISAPPEAR hatası OLMAYACAK, ama daha da önemlisi .map yöntemi de. Doğru sonuçlar üretmek için ÇALIŞIN. Başka hiçbir şey.
William Hou

"EpicVoyage" - sorun burada, soruyu anlamamış olmanızdır. Asıl soru "data.map bir işlev değildir" ve lütfen sayfanın en üstüne gidip ona bir göz atın. Benim projem değil. Tekrar ediyorum: BU BENİM PROJEM DEĞİL. "Data.map bir işlev değildir" HATASI'nın nasıl düzeltileceği budur.
William Hou


1

Bir nesneyi eşlemek istiyorsanız, Lodash'ı kullanabilirsiniz. NPM veya Yarn ile kurulduğundan emin olun ve içe aktarın.

Lodash ile:

Lodash _.mapValues, değerleri eşlemek ve anahtarları korumak için bir işlev sağlar .

_.mapValues({ one: 1, two: 2, three: 3 }, function (v) { return v * 3; });

// => { one: 3, two: 6, three: 9 }

0

Her zaman aşağıdakileri yapabilirsiniz:

const SomeCall = request.get(res => { 

const Store = []; 
Store.push(res.data);

Store.forEach(item => { DoSomethingNeat 
});
}); 

0
this.$http.get('https://pokeapi.co/api/v2/pokemon')
.then(response => {
   if(response.status === 200)
   {
      this.usuarios = response.data.results.map(usuario => {
      return { name: usuario.name, url: usuario.url, captched: false } })
          }
    })
.catch( error => { console.log("Error al Cargar los Datos: " + error ) } )

Merhaba Fernando, Stack Overflow'a hoş geldiniz! Bu yalnızca İngilizce bir sitedir. Cevabınızın İngilizce olarak gönderilmemiş kısmını düzenledim . Çevirip yeniden eklemekten çekinmeyin.
Pika Balinaların Büyücüsü

0

verilerin Json nesnesi olması gerekir, bunun için lütfen aşağıdakilerden emin olun:

data = $.parseJSON(data);

Şimdi şöyle bir şey yapabilirsiniz:

data.map(function (...) {
            ...
        });

Umarım bu birine yardımcı olur


-1

$.map()Çağrıda bir hata var , şunu deneyin:

    function getData(data) {
        this.productID = data.product_id;
        this.productData = data.product_data;
        this.imageID = data.product_data.image_id;
        this.text = data.product_data.text;
        this.link = data.product_data.link;
        this.imageUrl = data.product_data.image_url;
    }

    $.getJSON("json.json?sdfsdfg").done(function (data) {

        var allPosts = $.map(data,function (item) {

            for (var i = 0; i < item.length; i++) {
                new getData(item[i]);
            };

        });

    }); 

Kodunuzdaki hata return, AJAX çağrınızda yaptığınız, dolayısıyla yalnızca bir kez yürütülmesiydi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.