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

TypeScript数组去重问题:移除重复名称函数返回空数组

解决对象数组去重返回空数组的问题

问题根源

  1. API数据结构处理错误:你使用的是Parse REST API,它的返回格式是包含results字段的对象(而非直接返回数组)。当前getNames函数直接返回整个data对象,导致后续传入removeDuplicateNames的不是数组而是普通对象。普通对象无法被Set直接迭代,所以[...new Set(names)]会生成空数组。
  2. 对象数组去重逻辑错误:即便拿到正确的数组,new Set()也无法对对象数组按Name字段去重——因为对象是引用类型,哪怕属性完全一致,不同对象的引用地址不同,都会被Set视为独立元素。

修正方案

第一步:正确提取API返回的数组

修改getNames函数,从返回数据中提取results数组:

return axios
  .request(options)
  .then(({ data }: { data: { results: Names[] } }) => {
    return data.results; // 取出实际的名称数组
  })
  .catch((error: any) => {
    console.error(error);
    throw error;
  });

第二步:实现按Name去重的函数

用Set记录已出现的名称,配合filter过滤重复项(保留第一个出现的元素):

function removeDuplicateNames(names: Names[]) {
  const seenNames = new Set();
  return names.filter(item => {
    if (seenNames.has(item.Name)) {
      return false;
    }
    seenNames.add(item.Name);
    return true;
  });
}

如果需要保留最后一个出现的重复项,可以用Map实现:

function removeDuplicateNames(names: Names[]) {
  const nameMap = new Map();
  names.forEach(item => {
    nameMap.set(item.Name, item); // 后续重复项会覆盖之前的
  });
  return Array.from(nameMap.values());
}

完整修正后的代码

const axios = require('axios');

interface Names {
  objectId: string;
  Name: string;
  Gender: string;
  createdAt: string;
  updatedAt: string;
}

function getNames() {
  const options = {
    method: 'GET',
    url: 'API.COM',
    headers: {
      'X-Parse-Application-Id': 'xxx',
      'X-Parse-REST-API-Key': 'xxx',
    },
  };

  return axios
    .request(options)
    .then(({ data }: { data: { results: Names[] } }) => {
      return data.results;
    })
    .catch((error: any) => {
      console.error(error);
      throw error;
    });
}

function removeDuplicateNames(names: Names[]) {
  const seenNames = new Set();
  return names.filter(item => {
    if (seenNames.has(item.Name)) {
      return false;
    }
    seenNames.add(item.Name);
    return true;
  });
}

async function main() {
  try {
    const namesFromApi = await getNames();
    const uniqueNames = removeDuplicateNames(namesFromApi);

    console.log('原始数据:', namesFromApi);
    console.log('去重后的数据:', uniqueNames);
  } catch (err) {
    console.error('执行出错:', err);
  }
}

main();

额外说明

如果你的API确实直接返回数组(非Parse格式),那空数组问题可能是API返回空或请求失败,可以检查getNames的返回值确认。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 21:53:27