TypeScript数组去重问题:移除重复名称函数返回空数组
解决对象数组去重返回空数组的问题
问题根源
- API数据结构处理错误:你使用的是Parse REST API,它的返回格式是包含
results字段的对象(而非直接返回数组)。当前getNames函数直接返回整个data对象,导致后续传入removeDuplicateNames的不是数组而是普通对象。普通对象无法被Set直接迭代,所以[...new Set(names)]会生成空数组。 - 对象数组去重逻辑错误:即便拿到正确的数组,
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
相关产品推荐
相关产品推荐

