2016-04-28 65 views
0

我遇到了一个我不能立即解释并想要解决的问题。如果我编写以下代码使用返回时映射未定义

this.metadata = json.metadata.map((x) => {return new Metadatum(x);}); 
console.log(this.metadata[0].value); 

对于json.metadata中的每个元素,输出都是'未定义的'。

如果,我写了下面的(不好用的地图功能的,我知道我可以只写一个foreach这里,结果都是一样的)

json.metadata.map(x => this.metadata.push(new Metadatum(x))); 
console.log(this.metadata[0].value); 

现在我得到正确的结果,而不是不确定的。

为什么对this.metadata(它是一个Metadatum [])的赋值没有定义?

+0

难道是'this.metadata'之前已经具有有效的值,你的第二个方式不工作,要么,但你看不到它,因为你不清除由先前的元素在推新的之前? – CherryDT

+0

@CherryDT this.metadata基本上被声明为一个数组。 (元数据:Metadatum []) –

回答

0

你可以使用任何的下列选项中使用.map

var data = [1, 2,3,4,5,6,7]; 
function Metadatum (x) { 
    this.value = x; 
} 

let metadata = data.map((x) => { return new Metadatum(x); }); 
let metadata1 = data.map(x => new Metadatum(x)); 
console.log(metadata[0].value); 
console.log(metadata1[0].value); 

一些语法ES6拉姆达的是如下:

(param1, param2, …, paramN) => { statements } 
(param1, param2, …, paramN) => expression 
    // equivalent to: => { return expression; } 

// Parentheses are optional when there's only one parameter: 
(singleParam) => { statements } 

singleParam => {语句}

// A function with no parameters requires parentheses: 
() => { statements } 

有关箭头函数的详细语法,请参阅:https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Functions/Arrow_functions

编辑:这里是工作示例JSBin链接:https://jsbin.com/huzuyo/1/edit?html,js,console

+0

我知道这一点,但是当我使用该语法时,该值是未定义的。我可以直接将它推到数组,并且它不是undefined –

+0

你可以创建一个JSBin,codepen或者plunkr来显示它吗?我编辑了我的答案并添加了一个JSBin链接 –

0

你应该检查你的数据结构; .map获取一个数组,然后返回一个新数组。 结帐这个例子:

var kvArray = [ 
    {key:1, value:10}, 
    {key:2, value:20}, 
    {key:3, value: 30} 
]; 

var reformattedArray = kvArray.map(function(obj){ 
    var rObj = {}; 
    rObj[obj.key] = obj.value; 
    return rObj; 
});