2017-10-05 45 views
0

我需要梳理我的数组,他是这样的:排序数据“ABR/2017年”

x = { 
    'Abr/2017': [ { id: 1 } ], 
    'Fev/2018': [ { id: 1 } ], 
    'Jul/2017': [ { id: 1 } ], 
    'Abr/2018': [ { id: 1 } ], 
    'Fev/2017': [ { id: 1 } ], 
    'Jul/2018': [ { id: 1 } ], 
    'Dez/2019': [ { id: 1 } ] 
} 

,我需要他成为第一个在一年,然后进行排序在几个月

+0

对象没有秩序。 –

+0

'x'不是一个数组,它是一个对象。对象键没有顺序。 –

回答

0

因为您的数据被表示为对象,您必须将其转换为数组作为第一步。然后你可以排序。之后你可以将结果数组映射到任何你想要的。

重要的是,如果你想保持这些数据以某种顺序,那么你必须使用阵列结构

let x = { 
 
    'Abr/2017': [ { id: 1 } ], 
 
    'Fev/2018': [ { id: 1 } ], 
 
    'Jul/2017': [ { id: 1 } ], 
 
    'Abr/2018': [ { id: 1 } ], 
 
    'Fev/2017': [ { id: 1 } ], 
 
    'Jul/2018': [ { id: 1 } ], 
 
    'Dez/2019': [ { id: 1 } ] 
 
} 
 
// this function transform your object to array representation 
 
// where your actual key (e.g. Fev/2017) is stored in helper 
 
// property called key 
 
function toArray(obj) { 
 
    return Object.keys(obj).reduce((arr, key) => { 
 
    arr.push({ key, data: obj[key] }) 
 
    return arr 
 
    }, []) 
 
} 
 

 
function byYearAndMonth() { 
 
    // month definition - help with sorting 
 
    let monthOrder = { 
 
    'Jan': 1, 
 
    'Fev': 2, 
 
    'Mar': 3, 
 
    'Abr': 4, 
 
    'Mai': 5, 
 
    'Jun': 6, 
 
    'Jul': 7, 
 
    'Ago': 8, 
 
    'Set': 9, 
 
    'Out': 10, 
 
    'Nov': 11, 
 
    'Dez': 12 
 
    } 
 
    let mapDate = function([month, year]) { 
 
    return [monthOrder[month], Number(year)] 
 
    } 
 

 
    // actual sorting function 
 
    return function(a, b) { 
 
    const [aMonth, aYear] = mapDate(a.key.split('/')) 
 
    const [bMonth, bYear] = mapDate(b.key.split('/')) 
 
    if(aYear < bYear) { 
 
     return -1 
 
    } 
 
    if(aYear > bYear) { 
 
     return 1 
 
    } 
 
    if(aMonth < bMonth) { 
 
     return -1 
 
    } 
 
    if(aMonth > bMonth) { 
 
     return 1 
 
    } 
 
    return 0 
 
    } 
 
} 
 

 
// lets try how it works 
 
let xArray = toArray(x) 
 
xArray.sort(byYearAndMonth()); 
 
var result = xArray.map(x => x) 
 
// with map (or reduce) you can transform it to whatever you want 
 
// I'm just returning exactly the same object 
 
console.log(result)