data.map no es una función


110

Me estoy golpeando la cabeza contra un error que no sé cómo solucionarlo. Tengo lo siguiente;

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"
        }
    }
]}

y el siguiente 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);
    });
});

Sin embargo, recibo un error de que map.data no está definido como función. Mirándolo, no sé qué es lo que no funciona, ya que lo he copiado en un nuevo proyecto a partir del código usado anteriormente. Lo único diferente es la fuente JSON. El anterior no tenía la {"products":parte antes de los corchetes []. ¿Es esto lo que me desconcierta?


72
Por favor, no te golpees la cabeza más, pasaremos por esto ...
Mark C.

map.data o data.map?
depperm

Respuestas:


187

Objetos, {}en JavaScript no tiene el método .map(). Es sólo para matrices , [].

Entonces, para que su código funcione, cambie data.map()a data.products.map()ya que productses una matriz sobre la que puede iterar.


iwow, funciona, muchas gracias tuve los mismos problemas había una fila antes de los datos
Anoop PS

63

La forma correcta de iterar sobre objetos es

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

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

Lea aquí para más detalles


10
a veces es posible que esté buscando valores, no claves> Object.values ​​(someObject) .map (function (item) ... // en lugar de keys
Ram

7

La respuesta MÁS SENCILLA es poner "datos" en un par de corchetes (es decir, [datos] ):

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

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

     });

Aquí, [datos] es una matriz y el método ".map" se puede utilizar en ella. ¡Esto funciona para mi! ingrese la descripción de la imagen aquí


¿No crea esto simplemente una nueva matriz con un solo elemento de datos: su objeto original? ¿Por qué necesitas mapear eso? var data = {foo: 'bar'}; [data].map(function (item) { console.log(item); });
EpicVoyage

Sí, simplemente crea una nueva matriz con un solo elemento de datos. No hay nada de malo en ello. No es que yo necesite mapear. Es el proyecto específico que necesita mapear. Si necesita mapear pero sus datos no son una matriz, habrá un error. Convertirlo en una matriz solo cambia su formato, no sus valores, y eso es justo lo que necesita el proyecto.
William Hou

Puede que me esté perdiendo algo. Me parece que su ejemplo haría lo mismo sin el mapa:$.getJSON("json/products.json").done(function (data) { var allProducts = new getData(data); });
EpicVoyage

Mi respuesta original es muy, muy, muy simple: es solo convertir los datos en una matriz, de modo que NO SOLAMENTE el error "data.map no es una función" DESAPARECERÁ, pero lo que es más importante, el método .map también TRABAJA para producir resultados correctos. Nada más.
William Hou

"EpicVoyage": el problema es que no comprende la pregunta. La pregunta original es "data.map no es una función", y por favor vaya a la parte superior de la página y échele un vistazo. No es MI proyecto. Repito: NO ES MI PROYECTO. Es cómo solucionar el ERROR "data.map no es una función".
William Hou


1

Si desea mapear un objeto, puede usar Lodash. Solo asegúrese de que esté instalado a través de NPM o Yarn e impórtelo.

Con Lodash:

Lodash proporciona una función _.mapValuespara mapear los valores y preservar las claves.

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

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

0

Siempre puede hacer lo siguiente:

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 ) } )

Hola Fernando, ¡y bienvenido a Stack Overflow! Este es un sitio solo en inglés. He editado la parte de su respuesta que no se publicó en inglés. Siéntase libre de traducirlo y volver a agregarlo.
Pika, el mago de las ballenas,

0

los datos deben ser un objeto Json, para hacerlo, asegúrese de lo siguiente:

data = $.parseJSON(data);

Ahora puedes hacer algo como:

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

Espero que esto ayude a alguien


-1

Hay un error en la $.map()invocación, intente esto:

    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]);
            };

        });

    }); 

El error en su código fue que hizo returnen su llamada AJAX, por lo que se ejecutó solo una vez.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.