Python按对象属性拆分对象列表并获取最大版本对象
按Amenity分组并获取每组最高Version的对象
嘿,这个需求其实挺典型的,咱们分两步来搞定:先把列表按amenity分组,再从每个分组里挑出version最大的对象。
第一步:按Amenity分组
你可以用JavaScript的reduce方法轻松实现分组,把相同amenity的对象归到同一个数组里:
const original_list = [ { amenity: "Parking", amount: 120, version: 1, percentage: 4, id: 1 }, { amenity: "Pool", amount: 300, version: 2, percentage: 10, id: 5 }, { amenity: "Pool", amount: 200, version: 1, percentage: 10, id: 2 } ]; // 分组操作 const groupedByAmenity = original_list.reduce((result, currentItem) => { // 如果当前amenity还没在结果里,先创建一个空数组 if (!result[currentItem.amenity]) { result[currentItem.amenity] = []; } // 把当前对象加入对应amenity的数组 result[currentItem.amenity].push(currentItem); return result; }, {}); // 现在你就能拿到想要的子列表了 const vlist_a = groupedByAmenity.Parking; const list_b = groupedByAmenity.Pool;
运行这段代码后,vlist_a就是仅包含Parking对象的数组,list_b就是两个Pool对象的数组,完全符合你的要求。
第二步:从每个分组获取Version最大的对象
接下来用reduce结合箭头函数(也就是你说的lambda表达式)就能找出每个分组里version最大的对象,这里有两种实用方式:
方式一:批量获取所有分组的最大Version对象
如果你想一次性拿到所有amenity对应的最大version对象,可以这样写:
const maxVersionItems = Object.entries(groupedByAmenity).map(([amenity, items]) => { // 用reduce遍历数组,保留version更大的对象 return items.reduce((maxItem, current) => { return current.version > maxItem.version ? current : maxItem; }); }); console.log(maxVersionItems); // 输出:[ // { amenity: "Parking", amount: 120, version: 1, percentage: 4, id: 1 }, // { amenity: "Pool", amount: 300, version: 2, percentage: 10, id: 5 } // ]
方式二:单独获取某个分组的最大Version对象
如果你只需要针对某个特定分组(比如Pool)获取最大version对象,直接对该分组数组用reduce即可:
const poolMaxVersionItem = list_b.reduce((max, item) => { return item.version > max.version ? item : max; }); console.log(poolMaxVersionItem); // 输出:{ amenity: "Pool", amount: 300, version: 2, percentage: 10, id: 5 }
简单说下逻辑:reduce会遍历数组里的每一个元素,每次对比当前元素和之前保存的「最大version对象」,如果当前元素的version更大,就替换掉之前的对象,最终剩下的就是整个分组里version最大的那个。
内容的提问来源于stack exchange,提问作者Stephen-Njoroge
相关产品推荐
相关产品推荐

