2016-03-07 2 views
0

Как преобразовать следующий массив JavaScript в неизменяемый. Карта, которую вводит «идентификатор» каждого объекта в списке?Преобразование Seq в 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 к Lastest возвращенного правильный экземпляр:

map = map.set(key, value);

+0

Я надеялся использовать Immutable, чтобы сделать ввод более функциональным способом, а не использовать стандартный JavaScript для мутации цикла и массива. Я ищу ответ, который использует Immutable.js для выполнения всей работы. – djskinner

+0

Он по-прежнему не является чистым immutable.js, но без цикла и более функциональным образом может быть следующим: 'const map = new Immutable.Map (buttons.map (button => [button.id, button])); '. Затем у вас есть карта и вы можете получить доступ к значениям, как вы пожелаете. Если вы хотите, вы также можете сделать сопоставление с Immutable.Seq, но это, кажется, только накладные расходы. Я создал небольшой JSBin, чтобы поиграть: http://jsbin.com/wumilesogi/edit?js,output – christianost

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