如何将数组转换为首尾元素键名不同的对象?
如何将数组转换为对象并为首尾元素设置不同键名
嘿,我看你已经实现了把日期数组转成带有selected和marked属性的对象,但现在卡在了给首尾元素设置不同键名上——这事儿其实不难,咱们只需要在reduce遍历的时候,判断当前元素是不是数组的第一个或者最后一个,然后给它们分配特殊的键名就好啦!
你的原代码里,reduce回调统一用当前日期字符串作为键名,所以所有元素的键都是日期格式,没法区分首尾。咱们稍微修改一下逻辑就能解决问题:
const dates: string[] = [ '2020-06-24', '2020-06-25', '2020-06-26', '2020-06-27', '2020-06-28', '2020-06-29', '2020-06-30', ]; const dateArrayToObject = () => { const totalDates = dates.length; return dates.reduce((acc, date, index) => { // 根据当前元素的位置分配不同键名 if (index === 0) { // 首元素用自定义键名,比如startDate acc.startDate = { selected: true, marked: true }; } else if (index === totalDates - 1) { // 尾元素用自定义键名,比如endDate acc.endDate = { selected: true, marked: true }; } else { // 中间元素保留原日期字符串作为键名 acc[date] = { selected: true, marked: true }; } return acc; }, {} as Record<string, { selected: boolean; marked: boolean }>); }; // 调用函数查看结果 console.log(dateArrayToObject());
代码说明:
- 先获取数组总长度
totalDates,用来判断最后一个元素的索引; - 利用
reduce的第三个参数index(当前遍历元素的位置)来区分首尾和中间元素; - 给首尾元素设置你需要的自定义键名(这里用了
startDate和endDate,你可以根据需求改成别的); - 加上了TypeScript类型注解让类型更严谨,如果不需要TS,直接去掉
as Record<...>部分即可。
运行后你会得到这样的对象结构:
{ startDate: { selected: true, marked: true }, '2020-06-25': { selected: true, marked: true }, '2020-06-26': { selected: true, marked: true }, '2020-06-27': { selected: true, marked: true }, '2020-06-28': { selected: true, marked: true }, '2020-06-29': { selected: true, marked: true }, endDate: { selected: true, marked: true } }
内容的提问来源于stack exchange,提问作者msmoore
相关产品推荐
相关产品推荐

