ES6下如何过滤含嵌套对象数组的对象数组并按data1排序?
处理嵌套对象数组的过滤与排序方案
嘿,我来帮你搞定这个嵌套数组的处理需求!针对你给出的myData结构,我们可以通过ES6的数组方法组合轻松实现目标,步骤拆解如下:
步骤1:提取所有嵌套的historicalData项
首先,我们需要把外层数组每个对象里的historicalData数组"打平",得到一个包含所有历史数据项的一维数组。这里用Array.flatMap()方法最合适,它会先映射每个元素,再将结果扁平化为新数组。
步骤2:过滤出data2 > 2的项
拿到一维数组后,用Array.filter()筛选出data2大于2的元素。
步骤3:按data1排序
最后用Array.sort()对过滤后的数组按data1排序。如果data1是字符串,直接用localeCompare比较即可;如果是数值类型,调整排序逻辑就行。
完整代码示例
const myData = [ { name: "", lastName: "", historicalData: [{ data1: 'b', data2: 0 }, { data1: 'a', data2: 30 }] }, { name: "", lastName: "", historicalData: [{ data1: 'c', data2: 6 }, { data1: 'd', data2: 1 }] } ]; // 完整处理流程 const result = myData // 打平嵌套的historicalData数组 .flatMap(item => item.historicalData) // 过滤出data2大于2的项 .filter(dataItem => dataItem.data2 > 2) // 按data1字符串升序排序 .sort((a, b) => a.data1.localeCompare(b.data1)); console.log(result); // 输出结果:[{data1: 'a', data2: 30}, {data1: 'c', data2: 6}]
额外实用说明
- 如果你希望保留外层对象的
name、lastName信息,而不是只提取历史数据项,可以调整flatMap的逻辑,把外层属性和历史数据项合并:
.flatMap(item => item.historicalData.map(data => ({ ...item, ...data })))
这样过滤后的结果会同时包含每个历史数据对应的外层对象属性。
- 如果
data1是数值类型,排序逻辑改成(a, b) => a.data1 - b.data1即可实现升序,降序则写成(a, b) => b.data1 - a.data1。
内容的提问来源于stack exchange,提问作者user9512732
相关产品推荐
相关产品推荐

