2016-02-04 2 views
0

Имеет ли смысл использовать массив (который может часто нажимать и сращиваться) как значение на карте ES6, или я должен придерживаться простых ассоциативных массивов?Mutable массивы как значения в ES6 Map

например что-то вроде следующего кода сервера Node, который будет отслеживать, какие пользователи уже загрузили конкретный файл

// initialisation 
var map = new Map(); 
map.set ("foo.png",[]); 

// push a new user id to array associated with hashString 
function userHasFile(filename,userId) { 

    // retrieve array of all userIds that have downloaded the file 
    var users = map.get(filename); 

    // delete the map reference since we are going to update it 
    map.delete(filename); 

    // push the new userId to the array of users that have downloaded file 
    users.push(userId); 

    // update the Map key to the new array 
    map.set(filename,users); 
} 

// example usage 
userHasFile("foo.png","user1"); 
userHasFile("foo.png","user2"); 

Я новичок в ES6 и простоте Карта API обращается ко мне, так что я m интересно, есть ли какие-либо преимущества \ downsides (такие как производительность, память, GC и т. д.) для этого подхода, используя стандартные ассоциированные массивы.

ответ

3

Абсолютно.

Наличие магазина в виде списка ключей является достаточно полезным образцом, который является одним из the data types in Redis.

Сохранение массива на карте - это абсолютно законная и полезная вещь. Это отличный способ сохранить список объектов, которые соответствуют некоторым критериям, и особенно эффективен в JavaScript (и на других языках, которые используют ссылки). На карте фактически не хранится копия массива, просто ссылка на нее, поэтому вы можете изменить массив извне карты, и карта будет обновляться без знания или изменения размера.

Однако вы должны быть осторожны, чтобы использовать более функциональные шаблоны, если они имеют смысл. Если у вас есть входящие элементы, вы можете передать их в карту/уменьшить (используя сокращение, чтобы сгруппировать их по ключу), а не сохранять карту и модифицировать базовые массивы. Здесь вы полагаетесь на ссылки и побочные эффекты.

Если вы хотите предотвратить обновление массивов в какой-то момент, вы можете заменить их неизменяемыми массивами, используя библиотеку, такую ​​как immutable.js.

Если вы работаете на сервере, скажем, с входящими запросами, которые вам нужно записать, но вы не знаете, когда они прибудут (тип кеша и флеша, который делает statsd), карта делает смысл:

let responses = new Map(); 

server.on('request', function (url, responseTime) { 
    if (!responses.has(url)) { 
    responses.set(url, []); 
    } 

    const times = responses.get(url); 
    times.push(responseTime); 
}); 

const flushTimer = setInterval(function() { 
    stats.write(responses); 
    responses = new Map(); 
}, 10*1000); 
Смежные вопросы