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

Angular 8中如何从对象数组获取并统计多字段去重值

如何统计对象数组中多字段的去重值

看起来你已经在尝试处理航空公司字段的去重啦,不过要同时搞定Airline、Flight、Agent、Commodity_level_1和Commodity_level_2这多个字段的去重统计,咱们可以用更通用、高效的方法来实现,一次性覆盖所有需求~

先明确两种常见需求

首先得理清你的具体需求:是要每个对象内部各字段的去重值,还是要整个数组中所有对象对应字段的全局唯一值集合?我会分别给出解决方案:

需求1:全局所有对象的字段唯一值集合

如果要统计整个数组里,所有对象的Airline、Flight等字段的所有唯一值,用Set来处理是最高效的——它会自动帮我们过滤重复值,而且性能比indexOf要好很多。

实现代码

// 定义需要处理的字段列表(要和你的数据键名对应)
const targetFields = ['airline', 'flight', 'agent', 'commodity_level_1', 'commodity_level_2'];

// 初始化存储每个字段唯一值的对象,用Set来自动去重
const uniqueFieldValues = {};
targetFields.forEach(field => {
  uniqueFieldValues[field] = new Set();
});

// 遍历数组,把所有字段值添加到对应的Set中
yourArray.forEach(element => {
  const data = element.selectedData;
  targetFields.forEach(field => {
    const value = data[field];
    // 考虑字段可能是数组(比如airline)或单个值的情况
    if (Array.isArray(value)) {
      value.forEach(item => uniqueFieldValues[field].add(item));
    } else {
      uniqueFieldValues[field].add(value);
    }
  });
});

// 可选:把Set转成数组(如果需要数组格式的结果)
Object.keys(uniqueFieldValues).forEach(field => {
  uniqueFieldValues[field] = Array.from(uniqueFieldValues[field]);
});

console.log('全局各字段去重结果:', uniqueFieldValues);

示例结果

假设你的数组数据是:

const yourArray = [
  {
    selectedData: {
      airline: ['AirArabia', 'Emirates', 'AirArabia'],
      flight: 'EK123',
      agent: 'AgentA',
      commodity_level_1: 'FlightTicket',
      commodity_level_2: 'Economy'
    }
  },
  {
    selectedData: {
      airline: ['Emirates', 'Turkish'],
      flight: 'TK456',
      agent: 'AgentB',
      commodity_level_1: 'FlightTicket',
      commodity_level_2: 'Business'
    }
  }
];

运行后会得到:

{
  airline: ['AirArabia', 'Emirates', 'Turkish'],
  flight: ['EK123', 'TK456'],
  agent: ['AgentA', 'AgentB'],
  commodity_level_1: ['FlightTicket'],
  commodity_level_2: ['Economy', 'Business']
}

需求2:每个对象内部的字段去重值

如果你的需求是对数组里的每个对象单独处理,得到该对象自身各字段的去重值,也可以用Set简化代码:

const targetFields = ['airline', 'flight', 'agent', 'commodity_level_1', 'commodity_level_2'];

yourArray.forEach(element => {
  const data = element.selectedData;
  const uniqueInCurrentElement = {};
  
  targetFields.forEach(field => {
    const value = data[field];
    if (Array.isArray(value)) {
      // 数组字段转Set再转回数组去重
      uniqueInCurrentElement[field] = [...new Set(value)];
    } else {
      // 单个字段本身就是唯一值(除非有null/undefined特殊情况,可按需处理)
      uniqueInCurrentElement[field] = value;
    }
  });
  
  console.log('当前对象的去重结果:', uniqueInCurrentElement);
});

为什么不用你当前的filter+indexOf?

你当前的代码是在循环里对每个对象的airline数组用filter((v,i,a) => a.indexOf(v) === i)去重,这个方法是可行的,但indexOf每次都会遍历数组,数据量大的时候性能不如Set(Set的添加和查询都是O(1)时间复杂度)。而且如果要扩展到多个字段,用Set的方式代码更简洁通用,不用重复写过滤逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:16:37