如何合并数组中重复resource_name对象的weekdays属性
解决按resource_name合并对象数组并处理weekdays的问题
这个需求的核心是分组后逐位置合并数组,不管有多少个重复的resource_name,只要先把相同名称的对象归到一组,再对每组的weekdays数组逐个位置取非null值就行,完全能处理3个及以上同名称的情况。
实现思路
- 分组归类:用一个容器(比如
Map或者普通对象)把所有相同resource_name的对象的weekdays数组收集到一起,键就是resource_name,值是对应所有weekdays数组的集合。 - 逐位置合并:对每个分组里的
weekdays数组集合,遍历每个索引位置,找到该位置上的非null值(题目说无重叠冲突,所以不用担心多个非null的情况),组成新的weekdays数组。 - 转换格式:把分组后的结果转换成目标格式的数组即可。
代码示例(JavaScript)
const originalArray = [ {'resource_name': 'Objectname1', 'weekdays': [null, null, null, "vacation", "vacation"]}, {'resource_name': 'Objectname2', 'weekdays': [null, null, "vacation", "vacation", "vacation"]}, {'resource_name': 'Objectname1', 'weekdays': ["vacation", "vacation", null, null, null]}, {'resource_name': 'Objectname1', 'weekdays': [null, null, "vacation", null, null]} ]; // 1. 用Map分组,收集同一resource_name的所有weekdays数组 const groupedResources = new Map(); originalArray.forEach(item => { const name = item.resource_name; // 如果Map里没有这个名称,就初始化一个空数组 if (!groupedResources.has(name)) { groupedResources.set(name, []); } // 把当前对象的weekdays加到对应分组里 groupedResources.get(name).push(item.weekdays); }); // 2. 合并每个分组的weekdays数组,生成结果 const mergedArray = []; groupedResources.forEach((weekdaysCollection, resourceName) => { // 获取weekdays数组的固定长度(假设所有数组长度一致) const daysCount = weekdaysCollection[0].length; // 逐个位置处理,找到该位置的非null值 const mergedWeekdays = Array.from({ length: daysCount }, (_, index) => { // 遍历该索引下的所有值,取第一个非null的(因为无冲突,任意非null都可以) return weekdaysCollection.find(weekdays => weekdays[index] !== null)[index]; }); // 把合并后的对象加到结果数组 mergedArray.push({ resource_name: resourceName, weekdays: mergedWeekdays }); }); console.log(mergedArray);
代码解释
- 用
Map分组比普通对象更安全,因为它可以处理任何类型的键,不过如果你的resource_name都是字符串,用普通对象也完全没问题。 Array.from用来创建指定长度的数组,然后对每个索引位置,用find找到第一个在该位置非null的weekdays数组,取出对应值。- 这种方法不管有多少个重复的
resource_name都能处理,因为所有同名称的weekdays都会被收集到同一组,统一合并。
内容的提问来源于stack exchange,提问作者Fenrir
相关产品推荐
相关产品推荐

