2017-04-20 60 views
-1

如何将丑陋的forEach转换为更好的地图?如何将forEach转换为地图

convertedClientsToArray() { 
     let clientArray = []; 
     this.selectClients.forEach(client => { 
      clientArray[client.id] = client.name; 
     }) 
     return clientArray 
} 

我已经尝试过,但它不返回id作为关键。

感谢所有帮助

+0

你尝试声明你的地图而不是数组吗? – dloeda

+1

请添加一些数据。 –

+0

*难看forEach *? – Rajesh

回答

2

想必你想要的对象,而不是一个数组,其中包含映射到名字的ID。

尝试使用reduce,传入一个空对象作为初始值设定项。

convertedClientsToArray() { 
    return this.selectClients.reduce((map, client) => 
     ((map[client.id] = client.name), map), {}); 
} 
+0

这为我工作,谢谢! – mastercheef85

0

使用Array map()方法

var client = [ 
 
    { 
 
     "id": 1, 
 
     "name": "alpha" 
 
    }, 
 
    { 
 
     "id": 2, 
 
     "name": "beta"  
 
    }, 
 
    { 
 
     "id": 3, 
 
     "name": "gamma"  
 
    }, 
 
    { 
 
     "id": 4, 
 
     "name": "xyz"  
 
    } 
 
]; 
 

 
var res = client.map(function(item) { 
 
    var obj = {}; 
 
    obj[item.id] = item.name; 
 
    return obj; 
 
}); 
 

 
console.log(res);

使用ES6 arrow function expression地图

var client = [ 
 
    { 
 
     "id": 1, 
 
     "name": "alpha" 
 
    }, 
 
    { 
 
     "id": 2, 
 
     "name": "beta"  
 
    }, 
 
    { 
 
     "id": 3, 
 
     "name": "gamma"  
 
    }, 
 
    { 
 
     "id": 4, 
 
     "name": "xyz"  
 
    } 
 
]; 
 

 
var obj = {}; 
 
client.map(item => obj[item.id] = item.name); 
 

 
console.log(obj);

+1

没有'return'的'Array.map'只是在浪费功能。使用'forEach'。 – Rajesh

+0

@Rajesh感谢您纠正我。我更新了我的答案。 –

+0

这会产生不正确的输出。它将有多个对象。 '.map'不适用于这种情况,我们应该建议正确的方法。使用'.forEach'或'.reduce' – Rajesh

1

clientArray必须是一个对象({})不是数组([])。然后你可以使用这样的reduce

convertedClientsToArray() { 
    return this.selectClients.reduce((result, client) => { 
     result[client.id] = client.name; 
     return result; 
    }, {}); // initial value of result is {} 
}