Map 不是一个函数

我对一个我不知道如何修复的错误感到头疼

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

以及下面的 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);
});
});

但是我得到一个错误,map.data 没有被定义为函数?看着它,我不知道什么是不工作,因为我已经复制到一个新的项目从以前使用的代码。唯一不同的是 JSON 源代码。前一个在[]括号之前没有 {"products":部分。这就是让我分心的原因吗?

548499 次浏览

对象,JavaScript 中的 {}没有方法 .map()。它只适用于 阵列[]

因此,为了让代码工作,将 data.map()更改为 data.products.map(),因为 products是一个可以迭代的数组。

data不是一个数组,它是一个带有产品数组的对象,因此可以在 data.products上迭代

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

$.map()调用出现错误,请尝试以下操作:

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


});


});

代码中的错误是在 AJAX 调用中执行了 return,因此它只执行一次。

对对象进行迭代的正确方法是

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


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

详情请参阅此网页

你可以这样做:

const SomeCall = request.get(res => {


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


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

如果要映射对象,可以使用 Lodash。只要确保它是通过 NPM 或纱线安装和导入。

和 Lodash 一起:

Lodash 提供了一个函数 _.mapValues来映射这些值并保留键。

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


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

Data 需要是 Json 对象,为此请确保如下:

data = $.parseJSON(data);

现在你可以这样做:

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

我希望这能帮到某人

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

在某些情况下(并非全部) ,最简单的答案是将 「资料」放入一对方括号(即 [资料]) ,将“数据”中的项目更改为一个数组:

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


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


});

在这里,[资料]是一个数组,可以对它使用 “ . map”方法enter image description here

或以下列方式将「资料」转换为数组:

     let dataArr = Array.from(data);


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


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


});

但这里的关键问题在于把“产品”从“数据”中剔除出去:

     data.products

“ products”是一个数组。

然后可以使用“ . map”:

     data.products.map

解决方案: 没有适用于 对象{}的 Map 方法。 Map 方法适用于我们像[]那样声明的数组。 如果您希望您的代码能够正确地执行所需的结果,那么您需要将 数据,地图更改为 Map (),因为 产品是一个数组,您可以轻松地对它进行迭代。