JavaScript/TypeScript数组去重:按日期保留有效值或单个空值
JavaScript/TypeScript数组去重与空值处理方案
需求规则
对由[日期字符串, 数值|null]组成的数组,执行以下处理逻辑:
- 当同一日期存在非空数值时,删除该日期下所有空值项,仅保留非空值项
- 当某日期下所有项的值都是
null时,仅保留该日期的一个空值项
原始示例数组
const originalArray = [ ['2022-12-05', null], // 因「原因1」移除 ['2022-12-05', 2695.923015841], // 保留(该日期有非空值) ['2022-12-05', null], // 因「原因1」移除 ['2022-12-05', null], // 因「原因1」移除 ['2022-12-12', null], // 因「原因1」移除 ['2022-12-12', 3984.864626441], // 保留(该日期有非空值) ['2022-12-12', null], // 因「原因1」移除 ['2022-12-12', null], // 因「原因1」移除 ['2022-12-19', null], // 因「原因2」移除 ['2022-12-19', null], // 因「原因2」移除 ['2022-12-19', null], // 因「原因2」移除 ['2022-12-19', null] // 保留(该日期无任何非空值) ];
移除原因说明
- 原因1:同一日期存在非空值,此类空值项属于重复冗余项,需移除
- 原因2:同一日期下全为空值,仅需保留一个空值项,其余重复项移除
预期处理结果
const resultArray = [ ['2022-12-05', 2695.923015841], ['2022-12-12', 3984.864626441], ['2022-12-19', null] ];
实现代码
JavaScript版本
function processArray(arr) { // 按日期分组,统计每个日期的非空值状态与空值数量 const groups = {}; for (const [date, value] of arr) { if (!groups[date]) { groups[date] = { hasNonNull: false, nonNullValue: null, nullCount: 0 }; } if (value !== null) { groups[date].hasNonNull = true; groups[date].nonNullValue = value; } else { groups[date].nullCount++; } } // 基于分组信息生成结果数组 const result = []; for (const date in groups) { const group = groups[date]; if (group.hasNonNull) { result.push([date, group.nonNullValue]); } else { result.push([date, null]); } } return result; }
TypeScript版本
type DateValuePair = [string, number | null]; function processArray(arr: DateValuePair[]): DateValuePair[] { interface GroupInfo { hasNonNull: boolean; nonNullValue: number | null; nullCount: number; } const groups: Record<string, GroupInfo> = {}; for (const [date, value] of arr) { if (!groups[date]) { groups[date] = { hasNonNull: false, nonNullValue: null, nullCount: 0 }; } if (value !== null) { groups[date].hasNonNull = true; groups[date].nonNullValue = value; } else { groups[date].nullCount++; } } const result: DateValuePair[] = []; for (const date in groups) { const group = groups[date]; if (group.hasNonNull) { result.push([date, group.nonNullValue as number]); } else { result.push([date, null]); } } return result; }
代码逻辑说明
- 分组统计:遍历原始数组,按日期分组,记录每个日期是否存在非空值、对应的非空值内容,以及空值的数量
- 生成结果:遍历分组信息,若该日期存在非空值则添加非空值项;若全为空值则仅添加一个空值项
内容的提问来源于stack exchange,提问作者Mohammad Hosseini
相关产品推荐
相关产品推荐

