按时间排序创建新数组

时间:2014-04-17 12:22:22

标签: javascript

我有一个带有路径和时间戳的对象,如下所示:

{
    events: [
        {
            path: '/src/IMG__0001.jpg',
            time: '2011:03:11 11:29:27'
        },
        {
            path: '/src/IMG__0002.jpg',
            time: '2011:03:11 11:29:32'
        },
        {
            path: '/src/IMG__0003.jpg',
            time: '2011:03:11 11:29:37'
        },
        {
            path: '/src/IMG__0004.jpg',
            time: '2011:03:11 12:49:58'
        },
        {
            path: '/src/IMG__0005.jpg',
            time: '2011:03:11 12:50:14'
        },
        {
            path: '/src/IMG__0334.jpg',
            time: '2011:03:13 22:36:47'
        },
        {
            path: '/src/IMG__0335.jpg',
            time: '2011:03:13 22:38:49'
        }
    ]
}

现在,我想对它进行排序并使用以下结构创建一个新对象:

{
    events: [ 
        {
            date: '11.03.2011',
            imgs: [
                {
                    path: '/src/IMG__0001.jpg',
                    time: '2011:03:11 11:29:27'
                },
                {
                    path: '/src/IMG__0002.jpg',
                    time: '2011:03:11 11:29:32'
                },
                {
                    path: '/src/IMG__0003.jpg',
                    time: '2011:03:11 11:29:37'
                },
                {
                    path: '/src/IMG__0004.jpg',
                    time: '2011:03:11 12:49:58'
                },
                {
                    path: '/src/IMG__0005.jpg',
                    time: '2011:03:11 12:50:14'
                }
            ]
        }, 
        {
            date: '13.03.2011',
            imgs: [
                {
                    path: '/src/IMG__0334.jpg',
                    time: '2011:03:13 22:36:47'
                },
                {
                    path: '/src/IMG__0335.jpg',
                    time: '2011:03:13 22:38:49'
                }
            ]
        } 
    ]
}

我知道我必须比较“时间”值,如果是新的一天,我必须在我的对象中创建一个带有“日期”的新插页。

2 个答案:

答案 0 :(得分:1)

此代码将按日期对图像进行分组,并对组中的每组图像进行排序

//var array = your images

var output = [],
    seenDates = {}

for (var i = 0, _len = array.length; i < _len; i++) {
    var image = array[i],
        timeSplit = image.time.split(" "),
        date = timeSplit[0].replace(/:/g,".")

    if ( !seenDates[date] ) {
        //create an object
        var obj = {
            date: date,
            imgs: [image]
        }

        //push it into the output, and seenDates object for easy access, changes in seenDates will be reflected in output to prevent nesting loops
        output.push(obj)
        seenDates[date] = {
            "_ref": obj
        }
    } else {
        seenDates[date]["_ref"].imgs.push(image)        
    }
}

//Start Sorting
var formatDate = function(dateString) {
    dateString = dateString.split(" ")
    dateString[0].replace(/:/g,".")
    return dateString.join(" ")
}

output = output.sort(function(a,b){
    return new Date(a.date) > new Date(b.date)
})

for ( var i = 0, _len = output.length; i < _len; i++ ) {
    var images = output[i].imgs

    images = images.sort(function(a,b){            
        return new Date(formatDate(a.time)) > new Date(formatDate(b.time))
    })
}

请参阅小提琴:http://jsfiddle.net/879Lr/3/

答案 1 :(得分:0)

困难的部分是这些日期很难解析,因为月/年/日部分由:而非-分隔,因此我们可以轻松转换为ISODates以使{{1部分工作正常。

我在每个循环中对new Date数组进行排序,因此这不是高效的 - 这是一个留给读者的练习。

这是jsfiddle

imgs