JS如何给对象数组补全所有唯一属性并格式化日期字符串
代码逻辑错误点
- 嵌套循环逻辑错误:外层遍历所有唯一键,内层遍历当前对象的属性,每次内层循环都会覆盖当前唯一键的赋值,只有当内层循环刚好遍历到和当前外层唯一键同名的属性时赋值才正确,后续其他属性的遍历都会把该唯一键的值错误覆盖为
NC,最终只有原对象最后一个属性对应的唯一键能保留正确值 - 未实现日期格式转换逻辑:预先定义的日期匹配正则没有被使用,无法完成日期字符串的格式转换
- 默认值不符合要求:需求要求缺失键默认赋值为空字符串,原代码里写的是
NC
修复方案
首先可以用Set优化唯一键收集逻辑,实现更简洁:
// 原始数据 const documents = [ { "key1": "val1", "key2": "2019-08-23 00:00:00", "key3": "val2", "key4": "val3", "key5": "val4" }, { "key1": "val5", "key2": "2019-08-23 00:00:00", "key3": "val6" }, { "key6": "val7", "key7": "val8" } ] // 收集所有唯一键 const keyArr = [...new Set(documents.flatMap(item => Object.keys(item)))] // 日期匹配正则 const dateRegex = /^\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}$/ const result = []
处理每个对象时直接遍历唯一键数组即可,不需要嵌套遍历原对象属性:
documents.forEach(item => { const processed = {} keyArr.forEach(key => { // 取原对象对应键的值,不存在则默认空串 let value = item[key] ?? '' // 匹配到符合格式的日期字符串则截取前10位(yyyy-MM-dd) if (typeof value === 'string' && dateRegex.test(value)) { value = value.slice(0, 10) } processed[key] = value }) result.push(processed) })
输出的result完全符合预期要求。
内容的提问来源于stack exchange,提问作者davidvera
相关产品推荐
相关产品推荐

