一个数组转树的算法问题?

源数据

[
    {id: 1, matter: 'xxx', current: '2018-10-31 09:30:00', photo: ['xxx', 'xxx']},
    {id: 2, matter: 'xxx', current: '2018-10-31 11:30:00', photo: ['xxx', 'xxx']},
    {id: 3, matter: 'xxx', current: '2018-10-30 08:47:00', photo: ['xxx', 'xxx']}
]

处理后数据

外层数组按date排序,越晚越靠前;内层数组按time排序,越早越靠前

[
    {
        date: '2018-10-31',
        list: [
            {
                time: '9:30',
                matter: 'xxx',
                photo: ['xxx', 'xxx']
            },
            {
                time: '11:30',
                matter: 'xxx',
                photo: ['xxx', 'xxx']
            }
        ]
    }
    {
        date: '2018-10-30',
        list: [
            {
                time: '08:47',
                matter: 'xxx',
                photo: ['xxx', 'xxx']
            }
        ]
    }
]

来大神

阅读 2.8k
4 个回答

先按照date进行聚合,然后再对每个date里的list进行排序,最后整个大的数组再排序:

var data = [
    {id: 1, matter: 'xxx', current: '2018-10-31 09:30:00', photo: ['xxx', 'xxx']},
    {id: 2, matter: 'xxx', current: '2018-10-31 11:30:00', photo: ['xxx', 'xxx']},
    {id: 3, matter: 'xxx', current: '2018-10-30 08:47:00', photo: ['xxx', 'xxx']}
];

function conver(arr){
    let temp = {},
        result = [];

    // sarray 要排序的数组
    // key 根据哪个字段排序
    // sort 降序desc / 升序 asc
    let sort = (sarray, key, sort)=>{
        return sarray.sort((a, b)=>{
            return (sort==='desc' ? b[key] - a[key] : a[key] - b[key]) ? -1 : 1;
        });
    };

    arr.forEach(item=>{
        let current = item.current.split(' '),
            date = current[0],
            time = current[1];

        if( !temp[date] ){
            temp[date] = {
                date: date,
                list: []
            };
        }
        temp[date].list.push({
            time: time,
            matter: item.matter,
            photo: item.photo
        });
    });
    for(let key in temp){
        temp[key].list = sort(temp[key].list, 'time');
        result.push(temp[key]);
    }
    return sort(result, 'date', 'desc')
}
var s = conver(data);
console.log(s);
var data = [
    {id: 3, matter: 'xxx', current: '2018-10-30 08:47:00', photo: ['xxx', 'xxx']},
    {id: 2, matter: 'xxx', current: '2018-10-31 11:30:00', photo: ['xxx', 'xxx']},
    {id: 1, matter: 'xxx', current: '2018-10-31 09:30:00', photo: ['xxx', 'xxx']}
];
//初步处理日期信息
function step1(data){
    var arr = null;
    for (var i in data) {
        arr = data[i].current.split(" ")
        data[i].date = arr[0]
        data[i].time = arr[1]
    }
    return data;
}
// 同日期的数据归类
function step2(data) {
    var newdata = {};
    for(var i in data) {
        if (typeof newdata[data[i].date] == 'undefined'){
            newdata[data[i].date] = {
                date: data[i].date,
                list: []
            }
        }
        newdata[data[i].date].list.push({
            time: data[i].time,
            matter: data[i].matter,
            photo: data[i].photo
        })
    }
    
    return newdata;
}
// 将外部的json转数组 方便用arr.sort
function step3(data) {
    var newdata = [];
    for (var j in data) { // 将外部json转为数组 方便用arr.sort
        newdata.push(data[j])
    }
    return newdata;
}
// 排序
function step4(data) {
    // 外部日期排序
    data.sort(function(a,b){
        var at = +new Date(a.date)
        var bt = +new Date(b.date)
        return bt - at
    });
    // 内部list排序
    for (var i in data) {
        data[i].list.sort(function(a,b){
            var at = +new Date(data[i].date + " " + a.time)
            var bt = +new Date(data[i].date + " " + b.time)
            return at - bt
        });
    }
    return data;
}
data = step1(data);
console.log(data)
data = step2(data);
console.log(data)
data = step3(data);
console.log(data);
data = step4(data);
console.log(data);
var oarr = [
    { id: 1, matter: 'xxx', current: '2018-10-31 09:30:00', photo: ['xxx', 'xxx'] },
    { id: 2, matter: 'xxx', current: '2018-10-31 11:30:00', photo: ['xxx', 'xxx'] },
    { id: 3, matter: 'xxx', current: '2018-10-29 08:47:00', photo: ['xxx', 'xxx'] },
];
oarr.sort((a, b) => a.current > b.current ? 1 : -1);
//生成数组树
function createArrtree(oarr) {
    var o = {},
        arr = [];
    o.list = [];   
    oarr.forEach((elem) => {
        var [data, obj] = process(elem);
        if (o.data === data) {
            o.list.push(obj);
        }else {                    
            o = {};
            o.list = [];
            o.data = data;
            o.list.push(obj)
            arr.push(o);
        }
    })
    return arr;
}
//加工数组子对象
function process(obj) {
    var data = "";
    var time = obj.current.replace(/([\d-]+)\s/g, (match, $1) => {
        data = $1;
        return "";
    });
    obj.time = time;
    delete obj.id;
    delete obj.current;
    return [data, obj];
}
Array.from(
  arr.reduce((m, x) => {
    const [date, time] = x.current.split(' ')
    const list = m.get(date) || []
    list.push({ time: time.slice(0, -3), matter: x.matter, photo: x.photo })
    return m.set(date, list)
  }, new Map())
)
.map(([date, list]) => ({ date, list: list.sort((a, b) => a.time > b.time ? 1 : a.time < b.time ? -1 : 0) }))
.sort((a, b) => a.date > b.date ? -1 : a.date < b.date ? 1 : 0)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题