2016-12-30 2 views
1

Я пытаюсь использовать функцию карты массива для отображения моих данных в конкретный класс. Проект находится в Угловом.Array.map() to Class дает undefined на этом

Так что я:

me.$http({ 
    url: me.appConfig.api + `customer/${customer.number}/stock/warehouses`, 
    method: 'get' 
}).then((r: any) => { 
    def.resolve(r.data.map(Warehouse)); 
}).catch(def.reject); 

Довольно основной до сих пор. Тогда в моем классе Warehouse это выглядит следующим образом:

export class Warehouse { 
    code: string; 
    location: string; 
    weight: number; 
    count: number; 
    late: number; 

    stock?: Stock[]; 

    constructor(data?: any) { 
     console.debug('test', data); 
     this.code = 'test'; 
     if (data) { 
      this.code = data.code; 
      this.location = data.location; 
      this.weight = data.weight; 
      this.count = data.count; 
      this.late = data.late; 
     } 
    } 
} 

Так просто копия значений, но странно то, что уже ошибки на this.code = 'test', то я получаю ошибку:

TypeError: Cannot set property 'code' of undefined 
    at Warehouse (main.bundle.js:2218:19) 
    at Array.map (native) 

Есть ли подсказка, почему это происходит?

Образец данных:

[ 
    { 
    "code": "SQD", 
    "location": "35,16161;6,31561", 
    "weight": 3200, 
    "count": 18, 
    "late": 18 
    }, 
    { 
    "code": "GQZ", 
    "location": "35,16161;6,31561", 
    "weight": 321, 
    "count": 20, 
    "late": 18 
    } 
] 
+0

Можете ли вы поделиться образцами данных? Кроме того, я думаю, проблема связана с 'this', а не с' data' – Rajesh

+0

да, проблема кроется в «этом», поэтому я сделал 'this.code = 'test'', который не удался – Kiwi

+2

В моем понимании, вы будет иметь что-то вроде '.map (x => new Warehouse (x))' – Rajesh

ответ

0

Вы, кажется, передавая конструктору в функции карты массив, который, вероятно, не то, что вы хотите

def.resolve(r.data.map(Warehouse)); 

, вероятно, следует

def.resolve(new Warehouse(r.data)); 

функция r.data.map (FN) принимает функцию и возвращает массив, который возникает из-за принятия eac h элемент E r.data и вызов функции с E в качестве параметра, как в FN (E). см. https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/map

+0

, я предположил, что вам вообще не нужна функция отображения, так как ваш конструктор по существу ожидает данных obj и уже делает глубокую копию внутри. – softwarenewbie7331

+0

Это не то, что я хочу, beacuse Я хочу, чтобы каждый из 'r.data' был типа Warehouse;) – Kiwi

+0

в этом случае комментарий Rajesh, вероятно, то, что вы хотите – softwarenewbie7331

Смежные вопросы