2017-04-20 36 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 {} 
}