如何从给定JSON数据中获取唯一financial_year值的数组?
没问题,我来帮你搞定这个需求——从给定的数组里提取每个financial_year唯一对应的条目(或者仅提取唯一的年份值,看你具体需要)。这里有几种实用的JavaScript实现方法:
方法1:保留每个年份首次出现的完整条目(推荐,保留原顺序)
这种方法用Map来跟踪已经处理过的年份,会保留原数组中每个年份第一次出现的那条数据,同时保证结果的顺序和原数组中首次出现年份的顺序一致:
var data = [{"financial_year": 2017, "revenue": 2000, "costs": 1000}, {"financial_year": 2017, "revenue": 3000, "costs": 2000}, {"financial_year": 2016, "revenue": 1000, "costs": 500},{"financial_year": 2016, "revenue": 2000, "costs": 1000}, {"financial_year": 2015, "revenue": 5000, "costs": 3000}, {"financial_year": 2015, "revenue": 2000, "costs": 1000}]; const uniqueByYear = Array.from( data.reduce((yearMap, item) => { // 仅当该年份未被记录时,才添加到Map中 if (!yearMap.has(item.financial_year)) { yearMap.set(item.financial_year, item); } return yearMap; }, new Map()).values() ); console.log(uniqueByYear);
输出结果里,2017会保留第一个{"financial_year":2017,"revenue":2000,"costs":1000},2016保留第一个条目,以此类推。
方法2:仅提取唯一的年份值数组
如果你只需要得到所有不重复的年份数值,不需要完整的对象,这种写法更简洁:
const uniqueYears = [...new Set(data.map(item => item.financial_year))]; console.log(uniqueYears); // 输出: [2017, 2016, 2015]
原理是先用map把所有年份提取出来,再用Set自动去重,最后通过扩展运算符转成数组。
方法3:保留每个年份最后出现的条目
如果你的需求是保留每个年份最后一次出现的那条数据,只需要修改Map的逻辑,每次都覆盖已有记录:
const uniqueByLastYear = Array.from( data.reduce((yearMap, item) => { // 每次都覆盖,最后保留的就是该年份最后出现的条目 yearMap.set(item.financial_year, item); return yearMap; }, new Map()).values() );
比如2017会保留{"financial_year":2017,"revenue":3000,"costs":2000}这条。
兼容旧JavaScript环境的写法
如果需要兼容ES6之前的环境,可以用普通循环加对象跟踪:
var uniqueByYear = []; var seenYears = {}; for (var i = 0; i < data.length; i++) { var currentItem = data[i]; // 检查该年份是否已经被记录过 if (!seenYears[currentItem.financial_year]) { seenYears[currentItem.financial_year] = true; uniqueByYear.push(currentItem); } } console.log(uniqueByYear);
内容的提问来源于stack exchange,提问作者Hannan
相关产品推荐
相关产品推荐

