Я думаю, что в вашем случае то, что вы хотите сохранить в магазине, - это не массив, а объект, это упростило бы этот шаг. Что-то вроде:
export const store = readable({} , set => {
let channels = {};
let socket = new WebSocket("ws://localhost:65432");
socket.onmessage = function ({data}) {
let { channel, value } = JSON.parse(data);
// update `channels`
channels = {...channels, [channel]: value };
// set the new `channels` as store value
set(channels)
}
})
Обратите внимание, что таким образом у вас будет напрямую канал в качестве ключа объекта: поэтому, если канал уже существует, он будет обновлен, а не добавлен. И если он не существует, он будет добавлен.
Таким образом, у вашего подписчика может быть что-то вроде:
store.subscribe(channels => {
for (let [channel, value] of Object.entries(channels)) {
console.log(`channel ${channel} received ${value}`);
}
});
В качестве последнего примечания, учтите, что этот код создает новый объект каждое обновление, чтобы избежать побочных эффектов, это обычная практика. Однако, если у вас много данных в объекте и вы знаете о возможных последствиях, вы можете просто добавить / обновить единственный ключ, не дублируя каждый раз объект, по причинам производительности / памяти.
Надеюсь, это поможет!