Javascript阵列的季度到一年

时间:2018-05-07 17:39:36

标签: javascript

如果所有季度都存在,我如何将一年中的一系列季度转换为一年?否则有季度数据。 例如从像这样的年度季度

['1Q2017', '2Q2017', '3Q2017', '4Q2017', '1Q2018', '2Q2018', '3Q2018']

应该有这样的输出

['2017', '1Q2018', '2Q2018', '3Q2018']

4 个答案:

答案 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);

这些年可以使用Map,季度可以使用Map

此方法需要排序数据集。

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()来获取所需的结果。

<强>样本

&#13;
&#13;
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;
&#13;
&#13;