如果所有季度都存在,我如何将一年中的一系列季度转换为一年?否则有季度数据。 例如从像这样的年度季度
['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018']
应该有这样的输出
['2017', '1Q2018', '2Q2018', '3Q2018']
答案 0 :(得分:1)
试试这个
var arr = ['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018'];
var mapped = {};
var output = [];
arr.forEach(v => {
let sp = v.split('Q');
if(!mapped[sp[1]]) {
mapped[sp[1]] = [];
}
mapped[sp[1]].push(sp[0]);
});
Object.keys(mapped).forEach( k => {
if(mapped[k].length === 4) {
output.push(k)
}
else {
mapped[k].forEach(q => output.push(`${q}Q${k}`));
}
});
console.log(output);
output
将具有所需的值。
答案 1 :(得分:1)
通过检查最后一个季度并检查所有季度是否在结果集中的简短方法。然后添加年份而不是一年的季度字符串。
否则保留四分之一字符串。
此方法需要排序数据集。
var array = ['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018'],
result = array.reduce((r, s) => {
r.push(s);
if ([4, 3, 2, 1].every((q, i) => r[r.length - 1 - i] === q + 'Q' + s.slice(2))) {
r.length -= 4;
r.push(s.slice(2));
}
return r;
}, []);
console.log(result);
此方法需要排序数据集。
var array = ['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018'],
result = array.reduce((map => (r, s, i, a) => {
var [quarter, year] = s.split('Q');
if (!map.has(year)) {
map.set(year, new Set);
}
map.get(year).add(quarter);
if (quarter === '4' || i + 1 === a.length) {
if (map.get(year).size === 4) {
r.push(year);
} else {
r.push(...Array.from(map.get(year), q => q + 'Q' + year));
}
}
return r;
})(new Map), []);
console.log(result);
答案 2 :(得分:1)
我能想到的最简单的方法:
let x = ['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018']
let res = []
x.forEach((entry, index) => {
let year = entry.substring(entry.length - 4)
if (x.includes('1Q' + year) && x.includes('2Q' + year) &&
x.includes('3Q' + year) && x.includes('4Q' + year)) {
if (!res.includes(year)) {
res.push(year);
}
}
else {
res.push(entry)
}
})
console.log(res);
答案 3 :(得分:1)
您可以使用reduce()
,contact()
和Object.entries()
来获取所需的结果。
<强>样本强>
const arr = ['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018'];
let result = Object.entries(arr.reduce((r,v)=>{
let key = v.split('Q')[1];
r[key] =(r[key]||[]).concat(v);
return r;
},{})).reduce((r,v)=>r.concat(v[1].length==4?v[0]:v[1]),[]);
console.log(result)
&#13;
.as-console-wrapper {max-height: 100% !important;top: 0;}
&#13;