2016-12-15 1 views
0

Привет смотрите мой plunkr нижеAngularjs - соответствовать дате из массива дат, чтобы найти ближайший матч, чтобы отобразить в раскрывающемся списке

https://plnkr.co/edit/8cJZsb?p=preview

У меня есть $ scope.data, который выглядит следующим образом

$scope.data = [ 
    { 
     "projectedStart":"2017-01-20T00:00:00"  
    }, 
    { 
     "projectedStart":"2017-02-09T00:00:00"  
    } 
]; 

и $ scope.possibleDates, которые выглядят как этот

$scope.possibleDates = [{ 
     "projectedStartDate":"2017-01-25T00:00:00", 
     "dateName":"January - Week 4 (20/10)" 
    }, 
    { 
     "projectedStartDate":"2017-02-01T00:00:00", 
     "dateName":"February (6/10)" 
    }, 
    { 
     "projectedStartDate":"2017-03-01T00:00:00", 
     "dateName":"March (0/2)" 
    }, 
    { 
     "projectedStartDate":"2017-04-05T00:00:00", 
     "dateName":"April (2/5)" 
    }] 

O n в раскрывающемся списке переднего конца, я хочу иметь возможность отображать возможные даты, которые наиболее близки к дате 'projectedStart' в $ scope.data.

Я собираюсь сделать угловой foreach и прокрутить каждую проецируемую начальную дату в $ scope.data и как-то сравнить ее с каждой датой в $ scope.possibleDates и обновить $ scope.Data's projectedStart с ближайшим совпадением? К сожалению, пока что нет.

сильно бы признателен, если кто-то может мне точку в правильном направлении

+0

Когда вы говорите «Возможные даты, которые ближе всего к ...», сколько их вы ищете? 2 ближайших матча? 3? – Belfordz

+0

Я ищу 1 дату, которая соответствует или ближайшая – aliaz

ответ

0

Посмотрите, как вы должны смотреть в moment.js. Это впечатляющая библиотека для синтаксического анализа даты, форматирования и сравнения.

0

Вы можете поместить наблюдателя на possibleDates, и когда они меняют, вы вычисляете список, который вам нужен.

Список может быть легко написан с помощью инструментов, таких как момент и подчеркивание.

const projectedDate = moment($scope.data[0].projectedStartDate); 
const sortedPossibleDates = _.chain($scope.possibleDates) 
    .each((possibleDate) => { 
    possibleDate.diff = projectedDate.difference('seconds'); 
    }); 
    .sortBy('diff') 
    .value() 

И вуаля, sortedPossibleDates [0] Ваш лучший ответ

0

Основная функция сортировки должна иметь возможность заказать возможные сроки, насколько близки они к выбранной дате начала. Просто используйте новую дату (ISOString) для получения числовых временных меток.

От: https://stackoverflow.com/a/11796365/6452040

0

Если поместить функцию в script.js, как это, который находит ближайшую дату (до или после):

$scope.closestStartDate = function(startDate) { 
    var smallestDifferenceInDates = 1000000000000;//impossibly large value 
    var closestDateName = 'tmp'; 
    var date = new Date(startDate); 

    for (var i = 0; i < Object.keys($scope.possibleDates).length; i++) { 
     var projectedDate = new Date($scope.possibleDates[i].projectedStartDate); 
     if (Math.abs(date.getTime() - projectedDate.getTime()) < smallestDifferenceInDates) { 
     smallestDifferenceInDates = Math.abs(date.getTime() - projectedDate.getTime()); 
     closestDateName = $scope.possibleDates[i].dateName; 
    } 
    } 
    return closestDateName; 
} 

Затем измените код шаблона к следующему:

<tr ng-repeat="d in data"> 
    <td> 
     {{ closestStartDate(d.projectedStart) }} 
    </td> 
</tr> 

вы получите ближайшую дату от $ scope.possibleDates (Math.abs() получает расстояние между ними, если вы хотите даты после того как вы можете оставить, что в выключенном состоянии).

Смежные вопросы