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
相关产品推荐
相关产品推荐

