data.map은 함수가 아닙니다.


110

나는 고치는 방법을 찾을 수 없다는 오류에 대해 머리를 두드리고 있습니다. 다음이 있습니다.

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":에는 [] 대괄호 앞에 부분 이 없었습니다 . 이것이 나를 쫓아내는 것입니까?


72
더 이상 당신의 머리를 비난하지 마십시오 - 우리는이를 통해 얻을 것이다 ...
마크 C.

map.data 또는 data.map?
depperm

답변:


187

{}JavaScript의 객체 에는 메소드가 없습니다 .map(). 그것은 만의 배열 , [].

업무 변화에 대한 코드의 순서에 따라서 data.map()data.products.map()있기 때문에 products당신이에 반복 할 수있는 배열입니다.


덕분에, 작동 내가 데이터 이전 행이 있었다 같은 문제를 가지고 많은 iwow
Anoop PS

63

객체를 반복하는 올바른 방법은

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

7

가장 간단한 대답은 "데이터" 를 한 쌍의 대괄호 (예 : [data] ) 에 넣는 것입니다 .

     $.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

내 원래 대답은 매우, 매우, 매우 간단합니다. 데이터를 배열로 변환하는 것입니다. 따라서 "data.map is not a function"오류가 사라질뿐 아니라 더 중요한 것은 .map 메서드도 마찬가지입니다. 올바른 결과를 얻기 위해 노력하십시오. 다른 건 없습니다.
William Hou

"EpicVoyage"-문제는 질문을 이해하지 못한다는 것입니다. 원래 질문은 "data.map은 함수가 아닙니다"입니다. 페이지 상단으로 이동하여 살펴보십시오. 내 프로젝트가 아닙니다. 반복합니다 : 그것은 내 프로젝트가 아닙니다. "data.map이 함수가 아닙니다"오류를 수정하는 방법입니다.
William Hou


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에 오신 것을 환영합니다! 영어 전용 사이트입니다. 귀하의 답변 중 영어로 게시 되지 않은 부분을 ​​편집했습니다 . 자유롭게 번역하고 다시 추가하세요.
고래의 새앙 토끼의 마법사

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

        });

    }); 

코드의 오류는 returnAJAX 호출에서 만든 것이기 때문에 한 번만 실행되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.