data.map不是一个函数

mrc*_*cat 77 jquery json

我正在抨击一个错误,我无法解决如何解决问题.我有以下几点;

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"
        }
    }
]}
Run Code Online (Sandbox Code Playgroud)

和以下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);
    });
});
Run Code Online (Sandbox Code Playgroud)

但我收到一个错误,map.data未定义为函数?看着它我不知道什么没有工作,因为我已经从以前使用的代码复制到一个新项目.唯一不同的是json源.前一个没有{"产品":在[]括号之前的部分.这是什么让我失望?

Hen*_*son 125

对象,{}在JavaScript没有方法.map(),它只是为数组,[].

因此,为了使您的代码能够更改data.map(),data.products.map()因为products是一个可以迭代的数组.


小智 45

迭代对象的正确方法是

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

// ES way
Object.keys(data).map(item => {...});
Object.keys(data).forEach(item => {...});
Run Code Online (Sandbox Code Playgroud)

请阅读此处了解详情

  • 有时您可能正在寻找值而不是键> Object.values(someObject).map(function(item)... //而不是键 (6认同)
  • 有时您可能会同时查找 Key 和 Values => Object.entries(someObject).forEach(([key, value]) => console.log(`${key}: ${value}`)); (3认同)

Wil*_*Hou 10

简单的答案是将“数据”放入一对方括号中(即[data]):

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

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

     });
Run Code Online (Sandbox Code Playgroud)

这里,[data]是一个数组,可以对它使用“.map”方法。这个对我有用! 在此处输入图片说明

  • @WilliamHou 让我用一个类比来解释这个问题。OP 有一个锁箱,他需要帮助才能打开,但只有一把锤子,不能用。你不给他钥匙,而是建议他把锁箱放在木箱里,然后用锤子砸碎木箱。是的,他现在已经使用了锤子,但他仍然遇到原来的问题——一个锁着的密码箱。 (3认同)
  • 这不是简单地创建一个只有一个数据元素(您的原始对象)的新数组吗?为什么需要绘制它?`var data = {foo: 'bar'}; [数据].map(function (item) { console.log(item); });` (2认同)
  • 这是一个无意义的解决方案,并且在问题的上下文中**客观上不正确**。答案是使用“data.products.map”,而不是将“data”包装在数组中。您的答案会导致整个“data”对象被传递到“getData”中,它显然需要“data.products”中的元素之一作为其输入,而不是整个数据对象。当到达像“this.imageID = data.product_data.image_id;”这样的行时,您的答案将导致程序崩溃。即使情况并非如此,在数组中分层任意对象以使“map”可用仍然是无意义的。 (2认同)

Aru*_*hny 5

data不是一个数组,它是一个包含产品数组的对象,因此迭代data.products

var allProducts = data.products.map(function (item) {
    return new getData(item);
});
Run Code Online (Sandbox Code Playgroud)