data.map ไม่ใช่ฟังก์ชัน


119

ฉันกำลังทุบหัวกับข้อผิดพลาดที่หาวิธีแก้ไขไม่ได้ ฉันมีดังต่อไปนี้;

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":ส่วนก่อนเครื่องหมายวงเล็บ [] นี่คือสิ่งที่ทำให้ฉันผิดหวัง?


77
อย่าทุบหัวอีกต่อไป - เราจะผ่านมันไปให้ได้ ...
Mark C.

map.data หรือ data.map?
depperm

คำตอบ:


199

วัตถุ{}ใน JavaScript .map()ไม่ได้มีวิธีการ มันเป็นเพียงสำหรับArrays[] ,

ดังนั้นเพื่อให้โค้ดของคุณทำงานได้เปลี่ยนdata.map()เป็นdata.products.map()ตั้งแต่productsคืออาร์เรย์ที่คุณสามารถทำซ้ำได้


มันใช้งานได้ขอบคุณมากฉันมีปัญหาเดียวกันมีแถวก่อนข้อมูล
Anoop PS

65

วิธีที่ถูกต้องในการวนซ้ำวัตถุคือ

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

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

อ่านรายละเอียดได้ที่นี่


10
บางครั้งคุณอาจมองหาค่าที่ไม่ใช่คีย์> Object.values ​​(someObject) .map (function (item) ... // แทนคีย์
Ram

9

ง่ายที่สุดคำตอบคือการใส่"ข้อมูล"เป็นคู่ของวงเล็บ (เช่น[ข้อมูล] ):

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

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

     });

ที่นี่[data]คืออาร์เรย์และสามารถใช้เมธอด".map"ได้ ได้ผลสำหรับฉัน! ใส่คำอธิบายภาพที่นี่


นี่ไม่ใช่การสร้างอาร์เรย์ใหม่ที่มีองค์ประกอบข้อมูลเพียงอย่างเดียว - ออบเจ็กต์ดั้งเดิมของคุณหรือ ทำไมคุณต้องทำแผนที่นั้น? var data = {foo: 'bar'}; [data].map(function (item) { console.log(item); });
EpicVoyage

ใช่มันสร้างอาร์เรย์ใหม่โดยมีองค์ประกอบข้อมูลเพียงอย่างเดียว ไม่มีอะไรผิดปกติกับที่ ไม่ใช่ว่าฉันจะต้องทำแผนที่ เป็นโครงการเฉพาะที่ต้องทำแผนที่ หากจำเป็นต้องแมป แต่ข้อมูลของคุณไม่ใช่อาร์เรย์จะมีข้อผิดพลาด การแปลงเป็นอาร์เรย์เพียงแค่เปลี่ยนรูปแบบไม่ใช่ค่าและนั่นคือสิ่งที่โครงการต้องการเท่านั้น
William Hou

ฉันอาจจะขาดอะไรไป สำหรับฉันแล้วดูเหมือนว่าตัวอย่างของคุณจะทำสิ่งเดียวกันโดยไม่มีแผนที่:$.getJSON("json/products.json").done(function (data) { var allProducts = new getData(data); });
EpicVoyage

คำตอบเดิมของฉันนั้นง่ายมาก - เพียงแค่แปลงข้อมูลเป็นอาร์เรย์ดังนั้นข้อผิดพลาด DISAPPEAR "data.map ไม่ใช่ฟังก์ชัน" จะไม่เพียงเท่านั้น แต่ที่สำคัญกว่านั้นคือวิธีการ. map ก็เช่นกัน ทำงานเพื่อให้ได้ผลลัพธ์ที่ถูกต้อง ไม่มีอะไรอีกแล้ว.
William Hou

"EpicVoyage" - ปัญหาอยู่ที่นี่คือคุณไม่เข้าใจคำถาม คำถามเดิมคือ "data.map ไม่ใช่ฟังก์ชัน" โปรดไปที่ด้านบนสุดของหน้าและดูที่ ไม่ใช่โครงการของฉัน ฉันขอย้ำ: นี่ไม่ใช่โครงการของฉัน เป็นวิธีแก้ไข "data.map ไม่ใช่ฟังก์ชัน" ERROR
William Hou

4

data ไม่ใช่อาร์เรย์เป็นวัตถุที่มีอาร์เรย์ของผลิตภัณฑ์ดังนั้นจึงวนซ้ำ data.products

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

1

หากคุณต้องการแมปวัตถุคุณสามารถใช้ Lodash ตรวจสอบให้แน่ใจว่าได้ติดตั้งผ่าน NPM หรือ Yarn แล้วนำเข้า

ด้วย Lodash:

Lodash มีฟังก์ชัน_.mapValuesในการแมปค่าและเก็บรักษาคีย์

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

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

0

คุณสามารถทำสิ่งต่อไปนี้ได้ตลอดเวลา:

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

สวัสดี Fernando และยินดีต้อนรับสู่ Stack Overflow! เว็บไซต์นี้เป็นภาษาอังกฤษเท่านั้น ฉันได้แก้ไขส่วนของคำตอบของคุณที่ไม่ได้โพสต์เป็นภาษาอังกฤษ อย่าลังเลที่จะแปลและเพิ่มใหม่
Pika lè Sorcerer of the Whales

0

ข้อมูลจำเป็นต้องเป็นวัตถุ Json ในการดำเนินการดังกล่าวโปรดตรวจสอบสิ่งต่อไปนี้:

data = $.parseJSON(data);

ตอนนี้คุณสามารถทำสิ่งต่างๆเช่น:

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

ฉันหวังว่านี่จะช่วยได้บ้าง


-1

มีข้อผิดพลาดใน$.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]);
            };

        });

    }); 

ข้อผิดพลาดในรหัสของคุณคือคุณได้ทำการreturnโทร AJAX ดังนั้นจึงทำงานเพียงครั้งเดียว

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.