data.map is not a function

JqueryJson

Jquery Problem Overview


I'm bashing my head against an error I can't work out how to fix. I have the following;

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

and the following 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);
    });
});

yet I'm getting an error that map.data is undefined as a function? Looking at it I don't know what's not working as I've copied this to a new project from previously used code. The only thing different is the JSON source. The previous one didn't have the {"products": part before the [] brackets. Is this what's throwing me off?

Jquery Solutions


Solution 1 - Jquery

Objects, {} in JavaScript do not have the method .map(). It's only for Arrays, [].

So in order for your code to work change data.map() to data.products.map() since products is an array which you can iterate upon.

Solution 2 - Jquery

The right way to iterate over objects is

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

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

Read here for details

Solution 3 - Jquery

In some cases (not in all), the SIMPLEST answer is to put "data" into a pair of square brackets (i.e. [data]) to change the items in the "data" into an array:

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

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

     });

Here, [data] is an array, and the ".map" method can be used on it. It works for me! enter image description here

Or convert "data" into an array in the following way:

     let dataArr = Array.from(data);

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

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

     });

But the very question here is to get the "products" out of the "data":

     data.products

The "products" is an array.

And then ".map" can be used:

     data.products.map

Solution 4 - Jquery

data is not an array, it is an object with an array of products so iterate over data.products

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

Solution 5 - Jquery

If you want to map an object you can use Lodash. Just make sure it's installed via NPM or Yarn and import it.

With Lodash:

Lodash provides a function _.mapValues to map the values and preserve the keys.

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

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

Solution 6 - Jquery

data needs to be Json object, to do so please make sure the follow:

data = $.parseJSON(data);

Now you can do something like:

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

I hope this help some one

Solution 7 - Jquery

You can always do the following:

const SomeCall = request.get(res => { 

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

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

Solution 8 - Jquery

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

Solution 9 - Jquery

Solution: There is no map method for objects { }. Map method is for arrays which we declare like that [ ]. If you want your code to behaves properly for desired outcome you need to change data.map to data.products.map() because products is an array and you can easily iterate on it.

Solution 10 - Jquery

There is an error on $.map() invocation, try this:

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

	});	

The error in your code was that you made return in your AJAX call, so it executed only one time.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionmrcatView Question on Stackoverflow
Solution 1 - JqueryHenrik AnderssonView Answer on Stackoverflow
Solution 2 - Jqueryuser3930374View Answer on Stackoverflow
Solution 3 - JqueryWilliam HouView Answer on Stackoverflow
Solution 4 - JqueryArun P JohnyView Answer on Stackoverflow
Solution 5 - JqueryBill KingView Answer on Stackoverflow
Solution 6 - JqueryKenlly AcostaView Answer on Stackoverflow
Solution 7 - JqueryDaniel Ryan SnellView Answer on Stackoverflow
Solution 8 - JqueryFernando BetancourtView Answer on Stackoverflow
Solution 9 - JqueryJamal AshrafView Answer on Stackoverflow
Solution 10 - JqueryGiacomo PaitaView Answer on Stackoverflow