2015-07-25 2 views
0
год

У меня есть массив выглядит следующим образом:Использование JavaScript создать внутреннюю группу массива по месяцам и

var v = ["07/27/2015", "07/28/2015", "08/29/2015", "08/29/2015", "07/27/2016"] 

То, что я хочу сделать, это своего рода это динамически в новый пустой массив nv. Когда сортировка выполнена, nv должен выглядеть.

var nv = [["07/27/2015", "07/28/2015"], ["08/29/2015", "08/29/2015"], ["07/27/2016"]] 

Можно ли, например, отсортировать?

+0

Каковы критерии? – dramzy

+2

Группа за месяц, я полагаю ... – Glorfindel

+0

Я хочу отсортировать массив и создать новый внутренний массив, если дата находится в том же месяце и в том же году/Группа по месяцам и годам. – Subhajit

ответ

3
var dates = ["07/27/2015", "07/28/2015", "08/29/2015", "08/29/2015", "07/27/2016"]; 

var groupedDates = dates.reduce(function(l, r) { 
    var keyParts = r.split("/"), 
     key = keyParts[2] + keyParts[0]; 

    if (typeof l[key] === "undefined") { 
     l[key] = []; 
    } 

    l[key].push(r); 

    return l; 
}, {}); 

var result = Object.keys(groupedDates) 
        .sort(function(a, b) { return Number(a) - Number(b); }) 
        .map(function(key) { 
         return groupedDates[key]; 
        }); 

console.log(result); // [["07/27/2015","07/28/2015"],["08/29/2015","08/29/2015"],["07/27/2016"]] 

fiddle

+1

действительно чистый ответ. Но не общий. Что происходит, когда формат даты отличается? или они представляют собой комбинацию разных форматов даты? – Anurag

+0

Выглядит отлично. Еще раз спасибо. @Andreas – Subhajit

+0

@Anurag Или изменения основного календаря, или человеческая раса умирает ... ^^ Затем его нужно соответствующим образом скорректировать :) Мы можем работать только с предоставленной информацией, и они включают только один формат даты. Если будут другие форматы дат, я бы рекомендовал использовать библиотеку дат, такую ​​как momentjs, чтобы преобразовать строки даты в настоящие даты. Но это повлияет только на создание объектных ключей. – Andreas

0

Вы можете перемещаться по массиву и проверять каждое значение, если оно имеет новый месяц и год, или оно уже включено в отсортированный массив. Я думаю, как этот непроверенный код:

new_arr = new Array(); 
for(var i=0; i < v.length; i++){ 
    var this_date = new Date(v[i]); 
    var month_and_year = this_date.getMonth() + this_date.getFullYear(); 
    if(typeof(new_arr[month_and_year]) == 'undefined'){ 
     new_arr[month_and_year] = new Array(); 
    } 
    new_arr[month_and_year].push(v[i]) 
} 
+0

'Uncaught TypeError: невозможно прочитать свойство 'push' of undefined' – Andreas

+0

try typeof (new_arr [month_and_year]) == 'undefined'. Я отредактировал ответ – Tarek

+0

Вы подтвердили результат? http://jsfiddle.net/qe68xy7q/ – Andreas

2

Так что я сделал функцию, которая ставит даты в объект, свойства которого являются месяц и год. Дата вводится в собственность месяца и года. Затем функция создает массив и создает внутренний массив для каждого свойства функции. В каждом внутреннем массиве он помещает все даты этого свойства. Я понял, что этот подход будет более эффективным, чем вложенный для циклов.

// function takes an array of dates in the following format MM/DD/YYYY 
// outputs an array with inner arrays of dates. Each inner array contains dates of the same month and year 
var groupDates = function(dateArray) { 
    // create object to organize dates by month and year 
    var dateHash = {}; 
    // the array that is outputted 
    var groupedDates = []; 

    //for every date in dateArray 
    dateArray.forEach(function(currentDate) { 
     // check if any other dates with the same month and year exist in the dateHash object 
     if (dateHash[currentDate.substr(0, 2) + currentDate.substr(6)]) { 
      // if other dates exist, push the date to the array in the dateHash property for the dates current month and year 
      dateHash[currentDate.substr(0, 2) + currentDate.substr(6)].push(currentDate); 
     } else { 
      // otherwise create a property for the dates month and year and store the current date in an array in the propery 
      dateHash[currentDate.substr(0, 2) + currentDate.substr(6)] = [currentDate]; 
     } 
    }); 

    // for every propery in the datehash, push the array of dates into the grouped dates array 
    for (var dateGroup in dateHash) { 
     groupedDates.push(dateHash[dateGroup]); 
    } 
    return groupedDates; 
}; 

var dateArray = ["07/27/2015", "07/28/2015", "08/29/2015", "08/29/2015", "07/27/2016"]; 
console.log(groupDates(dateArray)); 
Смежные вопросы