2015-09-18 2 views
6

Я пытаюсь обновить свой код до ES6, поскольку я использую Node 4.0 и действительно люблю его функции. Однако у меня возникают проблемы с новой структурой данных ES6 Map, поскольку она ведет себя по-другому с {} при использовании Array в качестве ключа. Я использую его как счетную карту.Использование объектов Array в качестве ключа для ES6 Map

Я запустил этот код, и я хотел бы знать, как я могу использовать массивы в качестве ключей для Map.

"use strict"; 

var a = new Map(); 
a.set(['x','y'], 1); 
console.log(a.get(['x','y'])); 

var b = {}; 
b[['x','y']] = 1; 

console.log(b[['x','y']]); 

Она выводит следующее и первая строка должна быть 1 и не undefined:

undefined 
1 

Оригинальная карта JS stringifies ключ и я, не желая, чтобы сделать тот же самый тип stringify хака с новым ES6 Map.

Что я могу сделать, чтобы использовать массивы как ключи надежно для ES6 Map?

ответ

9

Поймите, что ключи ES2015 сопоставлены, как если бы с оператором ===. Два экземпляра массива, даже если они содержат одинаковые значения, никогда не сравниваются как === друг с другом.

Попробуйте это:

var a = new Map(), key = ['x', 'y']; 
a.set(key, 1); 
console.log(a.get(key)); 

Поскольку класс Карты предназначен, чтобы быть полезными в качестве базового класса, вы могли бы реализовать подкласс с наиважнейшей .get() функции, может быть.

+0

Спасибо за подробный ответ, но переопределение '.get()' не то, что я хочу сделать – jimjampez

1

Вам необходимо сохранить ссылку на не примитивный экземпляр Array, который вы использовали в качестве ключа. Обратите внимание на разницу в следующих двух примерах:

"use strict"; 
 

 
var a = new Map(); 
 
a.set(['x','y'], 1); 
 
console.log(a.get(['x','y'])); 
 
console.log(['x','y'] === ['x','y']); 
 

 
var b = new Map(); 
 
var array = ['x','y']; 
 
b.set(array, 1); 
 
console.log(b.get(array)); 
 
console.log(array === array);

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