You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;
}

代码逻辑说明

  1. 分组统计:遍历原始数组,按日期分组,记录每个日期是否存在非空值、对应的非空值内容,以及空值的数量
  2. 生成结果:遍历分组信息,若该日期存在非空值则添加非空值项;若全为空值则仅添加一个空值项

内容的提问来源于stack exchange,提问作者Mohammad Hosseini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:31:14