2016-03-07 85 views
0

如何將以下JavaScript數組轉換爲由列表中每個對象的「id」鍵入的Immutable.Map?通過自定義密鑰將序列轉換爲地圖

let buttons = [{ id: 'all', label: 'All', isSelected: false }, { id: '1', label: '1', isSelected: true }, { id: '2', label: '2', isSelected: false }, { id: '3', label: '3', isSelected: false }]

我希望能夠做到:

map.get('all') // {id: 'all', label: 'All', isSelected: true}

+0

不應該'map.get( '全部')''返回{ID: '所有',標籤: 'All',isSelected:false}'? – Nadir

+0

是的。我編輯了這個問題來糾正錯誤。謝謝。 – djskinner

+0

我已經使這個小提琴https://jsfiddle.net/ybL8n1r7/這可能是你在找什麼。如果你仍然想要對象符號(即'map.get()'函數),你應該將它轉換爲對象 – Nadir

回答

0

使用一成不變的:

var buttons = [{ 
    id: 'all', 
    label: 'All', 
    isSelected: false 
    }, { 
    id: '1', 
    label: '1', 
    isSelected: true 
    }, { 
    id: '2', 
    label: '2', 
    isSelected: false 
    }, { 
    id: '3', 
    label: '3', 
    isSelected: false 
}]; 

var array = {}; 

for(var index in buttons) { 
    var token = buttons[index]; 
    array[token.id] = token; 
} 

var map = new Immutable.Map(array); 

var test = map.get('all'); 

window.alert(test.label); 

如果你想添加鍵 - >值後,該地圖被修改,並且因此當前實例失效。要做到這一點,你需要reasign變量map到最新的返回有效實例:

map = map.set(key, value);

+0

我希望能夠使用Immutable以更實用的方式執行鍵控,而不是使用標準JavaScript進行循環和數組變形。我正在尋找一個使用Immutable.js完成所有工作的答案。 – djskinner

+0

它仍然不是純粹的immutable.js,但沒有for循環,並且功能更強大的方式可能如下:'const map = new Immutable.Map(buttons.map(button => [button.id,button] ));'。然後你有一張地圖,可以像你想的那樣訪問這些值。 如果你願意,你也可以用Immutable.Seq做映射,但是這似乎只是開銷。 我創建了一個小JSBin來玩:http://jsbin.com/wumilesogi/edit?js,output – christianost