data.map không phải là một hàm


110

Tôi đang vùi đầu vào một lỗi mà tôi không thể tìm ra cách khắc phục. Tôi có những thứ sau đây;

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

và jQuery sau

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

nhưng tôi gặp lỗi map.data không được xác định là một hàm? Nhìn vào nó, tôi không biết điều gì không hoạt động vì tôi đã sao chép nó vào một dự án mới từ mã đã sử dụng trước đó. Điều duy nhất khác biệt là nguồn JSON. Phần trước không có {"products":phần trước dấu ngoặc []. Đây có phải là những gì đang ném tôi đi?


72
Xin đừng bash đầu của bạn nữa - chúng tôi sẽ vượt qua chuyện này ...
Mark C.

map.data hay data.map?
depperm

Câu trả lời:


187

Đối tượng, {}trong JavaScript không có phương thức .map(). Nó chỉ dành cho Mảng , [].

Vì vậy, để cho mã của bạn để thay đổi công việc data.map()để data.products.map()từ productslà một mảng mà bạn có thể lặp thuận.


iwow nó hoạt động, cảm ơn rất nhiều, tôi đã gặp vấn đề tương tự, có một hàng trước dữ liệu
Anoop PS

63

Cách phù hợp để lặp lại các đối tượng là

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

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

Đọc ở đây để biết chi tiết


10
đôi khi bạn có thể tìm kiếm các giá trị không phím> Object.values (someObject) .map (function (item) ... // thay vì phím
Ram

7

Các ĐƠN GIẢN NHẤT Câu trả lời là để đưa "dữ liệu" thành một cặp dấu ngoặc vuông (ví dụ [dữ liệu] ):

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

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

     });

Ở đây, [data] là một mảng và phương thức ".map" có thể được sử dụng trên đó. Nó hoạt động cho tôi! nhập mô tả hình ảnh ở đây


Điều này không chỉ đơn giản là tạo một mảng mới với chỉ một phần tử dữ liệu - đối tượng ban đầu của bạn? Tại sao bạn cần lập bản đồ đó? var data = {foo: 'bar'}; [data].map(function (item) { console.log(item); });
EpicVoyage

Có, nó KHÔNG chỉ đơn giản là tạo một mảng mới với chỉ một phần tử dữ liệu. Chẳng có vấn đề gì với việc đấy cả. Tôi không phải là người cần lập bản đồ. Đó là dự án cụ thể cần phải lập bản đồ. Nếu nó cần ánh xạ nhưng dữ liệu của bạn không phải là một mảng, thì sẽ có lỗi. Việc chuyển đổi nó thành một mảng chỉ thay đổi định dạng của nó chứ không phải các giá trị của nó và đó chỉ là những gì dự án cần.
William Hou

Tôi có thể thiếu một cái gì đó. Đối với tôi, có vẻ như ví dụ của bạn sẽ làm điều tương tự mà không cần bản đồ:$.getJSON("json/products.json").done(function (data) { var allProducts = new getData(data); });
EpicVoyage

Câu trả lời ban đầu của tôi là rất, rất rất đơn giản - đó chỉ là chuyển đổi dữ liệu thành một mảng, vì vậy KHÔNG CHỈ CÓ lỗi "data.map không phải là một hàm" sẽ BỊ XÓA, mà quan trọng hơn, phương thức .map cũng sẽ LÀM VIỆC để tạo ra kết quả chính xác. Không có gì khác.
William Hou

"EpicVoyage" - vấn đề ở đây là bạn không hiểu câu hỏi. Câu hỏi ban đầu là "data.map không phải là một hàm", và vui lòng lên đầu trang và xem qua nó. Nó không phải là dự án của TÔI. Tôi xin nhắc lại: KHÔNG PHẢI LÀ DỰ ÁN CỦA TÔI. Đó là cách khắc phục LỖI "data.map không phải là một hàm".
William Hou

4

data không phải là một mảng, nó là một đối tượng với một mảng các sản phẩm vì vậy hãy lặp lại data.products

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

Hi tôi có cùng một lỗi, bạn có thể nhìn vào nó .. stackoverflow.com/questions/57834351/...
Hamid hafizi

1

Nếu bạn muốn ánh xạ một đối tượng, bạn có thể sử dụng Lodash. Chỉ cần đảm bảo rằng nó được cài đặt thông qua NPM hoặc Yarn và nhập nó.

Với Lodash:

Lodash cung cấp chức năng _.mapValuesánh xạ các giá trị và lưu giữ các khóa.

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

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

0

Bạn luôn có thể làm như sau:

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

Xin chào Fernando và chào mừng bạn đến với Stack Overflow! Đây là một trang web chỉ có tiếng Anh. Tôi đã chỉnh sửa một phần câu trả lời của bạn không được đăng bằng tiếng Anh. Hãy dịch nó và thêm lại nó.
Pika the Wizard of the Whales,

0

dữ liệu cần phải là đối tượng Json, để làm như vậy, hãy đảm bảo những điều sau:

data = $.parseJSON(data);

Bây giờ bạn có thể làm điều gì đó như:

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

Tôi hy vọng điều này sẽ giúp một số người


-1

Đã xảy ra lỗi khi $.map()gọi, hãy thử cách này:

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

        });

    }); 

Lỗi trong mã của bạn là do bạn đã thực hiện returntrong cuộc gọi AJAX của mình, vì vậy nó chỉ thực thi một lần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.