2 回答

TA貢獻2019條經驗 獲得超9個贊
您也可以使用 vanilla JS 相對簡單地完成此操作。這是一個版本:
const hoursToTimeStops = businessOpenSlots =>
? Object .fromEntries (
? ? Object .entries (businessOpenSlots) .map (([d, h]) => [d, h .flatMap (vm .getTimeStops)])
? )
const businessOpenSlots = {monday: [{open: "0800", close: "1530"}, {open: "1730", close: "1930"}], tuesday: [{open: "24hrs", close: "24hrs"}], wednesday: [{open: "0900", close: "1700"}], thursday: [{open: "0900", close: "1700"}], friday: [{open: "0900", close: "1700"}]}
console .log (hoursToTimeStops (businessOpenSlots))
.as-console-wrapper {max-height: 100% !important; top: 0}
<script> // Dummy implementation for `vm`.
const every15mins = (sh, sm, eh, em) => sh * 60 + sm > eh * 60 + em ? [] : [`${String(sh).padStart(2, '0')}:${String(sm).padStart(2, '0')}`, ...every15mins(sh + (sm >= 45 ? 1 : 0), (sm + 15) % 60, eh, em)]
const vm = {getTimeStops:? ({open, close}) => open === '24hrs' ? ["00:00"] : every15mins(Number(open.slice(0, 2)), Number(open.slice(2, 4)), Number(close.slice(0, 2)), Number(close.slice(2, 4)))}
</script>
lodash?(或 Ramda 的)很好地封裝了調用entries
、map
ping 結果、然后調用的過程,但其余部分似乎比您的 lodash 版本更簡單。fromEntries
mapValues
map
但是,我相信您應該能夠大大簡化該版本。我對 Ramda 更熟悉(免責聲明:我是它的作者之一),而且我知道在 Ramda 中,我們可以簡單地寫:
const?hoursToTimeStops?=?map?(chain?(vm.getTimeStops))
我猜你可以用 lodash 代替mapValues
和map
itsflatMap
代替chain
.?(除非你使用 Lodash FP,否則它可能不會那么優雅,但也不會差那么遠。)

TA貢獻1847條經驗 獲得超7個贊
自己找到解決方案并在此處發布以供社區使用。
我只需要使用_.mapValues()Lodash。
let availableSlots = _.mapValues(businessOpenSlots, function(slots, weekday) {
return _.spread(_.union)(_.map(slots, slot => {
return vm.getTimeStops(slot.open, slot.close);
}))
});
log(availableSlots)
它返回以下內容,正如我想要的那樣。
添加回答
舉報