Код Middle Сборка и OTA-обновления обновлено

Выбор совместимого обновления

Условие

Сервер обновлений хранит список updates: { id, runtimeVersion, channel, createdAt, rolloutPercent }. Напишите pickUpdate(updates, client), где client = { runtimeVersion, channel, bucket, currentId }, bucket это число 0..99, закреплённое за устройством. Подходят обновления того же runtimeVersion и канала, у которых bucket < rolloutPercent. Из подходящих выбрать самое новое по createdAt. Вернуть его id, либо null, если подходящих нет или самое новое уже установлено (currentId).

Примеры

pickUpdate([{"id":"u1","runtimeVersion":"1.0","channel":"production","createdAt":1,"rolloutPercent":100}], {"runtimeVersion":"1.0","channel":"production","bucket":50,"currentId":null}) // "u1"
pickUpdate([{"id":"u1","runtimeVersion":"1.0","channel":"production","createdAt":1,"rolloutPercent":100}, {"id":"u2","runtimeVersion":"1.0","channel":"production","createdAt":2,"rolloutPercent":100}], {"runtimeVersion":"1.0","channel":"production","bucket":0,"currentId":"u1"}) // "u2"
pickUpdate([{"id":"u3","runtimeVersion":"2.0","channel":"production","createdAt":5,"rolloutPercent":100}], {"runtimeVersion":"1.0","channel":"production","bucket":0,"currentId":null}) // null

Как подойти

Подсказки: 2
  1. Отфильтруйте по трём условиям, затем возьмите максимум по createdAt.
  2. Не забудьте сравнить результат с currentId.

Решите в тренажёре

Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.