Получение данных JSON по дате и выведение из него нового массива

Вы можете передать обратный вызов и вызвать обратный вызов внутри асинхронного вызова

примерно так:

class func getGenres(completionHandler: (genres: NSArray) -> ()) {
    ...
    let task = session.dataTaskWithURL(url) {
        data, response, error in
        ...
        resultsArray = results
        completionHandler(genres: resultsArray)
    }
    ...
    task.resume()
}

, а затем вызвать этот метод:

override func viewDidLoad() {
    Bookshop.getGenres {
        genres in
        println("View Controller: \(genres)")     
    }
}
0
задан DavidB 13 July 2018 в 13:36
поделиться

4 ответа

Как сказал Симеон, мое мнение такое же, я хотел бы добавить немного больше информации с ним.

Когда вы получили даты, вам нужно сделать две вещи:

  • Сначала проверяем, является ли это допустимой датой
  • . Его будущая / будущая дата или нет.

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

[
    {name: "Something", date: "12-12-2018"},
    {name: "Something", date: "12-12-2017"},
    {name: "Something", date: "12-12-2019"},
    {name: "Something", date: "12-5-2018"},
    {name: "Something", date: "12-2-2018"},
    {name: "Something", date: "SOMETHING_INVALID"},
    {name: "Something", date: "12-12-2016"},
]

Вы можете отфильтровать действительную дату и будущие даты с таким фильтром,

let dates = [
    {name: "Something", date: "1-12-2018"},
    {name: "Something", date: "2-12-2017"},
    {name: "Something", date: "3-12-2019"},
    {name: "Something", date: "4-5-2018"},
    {name: "Something", date: "5-2-2018"},
    {name: "Something", date: "InvalidSomething"},
    {name: "Something", date: "7-12-2016"},
]

let filteredDates = dates.filter((item) => {
    let date = new Date(item.date);
    if(date !== 'Invalid Date' && Date.now() < date.getTime()){
        return item;
    }
});


console.log(filteredDates);

Небольшое пояснение: Date.now() и date.getTime() оба используются для получения timestamp , и я сравниваю внутри JavaScript Filter, если объект даты не возвращает строку "Invalid Date", и если номер временной метки ** больше, чем сегодняшняя метка времени, тогда это будущая дата.

Когда эти два условия совпадают, тогда filter он вернет целую object, которая собирается с помощью переменной filteredDates. когда цикл будет выполнен, вы получите массив для дальнейшего использования. Ура!

0
ответ дан asifsaho 17 August 2018 в 12:42
поделиться

Я не знаю, как выглядят ваши данные, но, вообще говоря, вам нужно выполнить два шага:

  • преобразовать строки в фактические объекты Date
  • отфильтровать new Date(<ISO 8601 string>):

    new Date("2018-06-12"); // -> Tue Jun 12 2018 01:00:00 GMT+0100
    new Date("2018-07-13"); // -> Fri Jul 13 2018 01:00:00 GMT+0100
    

    Фильтрация прошлых событий может быть выполнена с помощью Array.filter . Вы даете ему функцию, которая возвращает True или False, и запускает ее для каждого элемента массива. Элементы, для которых возвращенный functiuon True помещается в новый массив:

    [1, 3, 4, 6, 7].filter(number => number > 4); // -> [6, 7]
    [1, 3, 4, 6, 7].filter(number => number <= 4); // -> [1, 3, 4]
    

    Итак, чтобы фильтровать прошлые даты / время, вы просто сравниваете их с сегодняшней датой. Единственная сложность в том, что предоставление строки, такой как 2018-06-07 (только дата, без указания времени) на new Date(…), устанавливает время на текущее:

    new Date("2018-06-07"); // -> Thu Jun 07 2018 01:00:00 GMT+0100
    

    Если вам нужно сравнить только по дней, а не часов или даже минут, удобно установить время до полуночи:

    (new Date("2018-06-07")).setHours(0) // -> Thu Jun 07 2018 00:00:00 GMT+0100
    

    Итак, когда собрано:

    const data = {
      events: [
        { name: "Event 1", date: "2018-06-12" },
        { name: "Event 2", date: "2018-07-10" },
        { name: "Event 3", date: "2018-07-12" },
        { name: "Event 4", date: "2018-07-13" },
        { name: "Event 5", date: "2018-08-01" }
      ]
    }
    
    const today = (new Date()).setHours(0) // past midnight
    
    const todayAndFutureEvents = data.events.filter(event => (new Date(event.date)) >= today);
    
    console.log(todayAndFutureEvents);

    Еще одна проблема может возникнуть, если ваши события происходят в нескольких часовых поясах, но это, вероятно, выходит за рамки этого вопроса ...

1
ответ дан helb 17 August 2018 в 12:42
поделиться

Ну, вы действительно не располагаете достаточной информацией о своей структуре JSON и тем, что вы уже достигли, поэтому, пожалуйста, добавьте больше деталей, если этого недостаточно, но что-то вроде этого, я предполагаю:

var eventsFromMyJSONstring = JSON.parse(theJSONstringFetchedFromCertainURL);
 var currentDate = new Date();
 eventsFromMyJSONstring.forEach(function(iEvent) {
    iEvent.newVarAsDate = new Date(iEvent.textDate);
    if (iEvent.newVarAsDate >= currentDate) {
        alert('hey, this object is from today or future');
    }
});

edit: также, возможно, вы хотите использовать фильтр, чтобы получить только текущие и будущие события ... что-то вроде:

var currentAndFutureEvents = eventsFromMyJSONstring.filter((iEvent) => new Date(iEvent.textDate) >= new Date());

(ES6 предположил там ...)

0
ответ дан LFLFM 17 August 2018 в 12:42
поделиться

Если вы передадите эту строку новой функции Date (yourString), она вернет вам объект даты JavaScript.

https://developer.mozilla.org/en-US/ docs / Web / JavaScript / Reference / Global_Objects / Date

Пример:

const newDate = new Date('2008-09-15T15:53:00')
// Will return a date object with the value of:
// Mon Sep 15 2008 15:53:00 GMT-0700 (Pacific Daylight Time)

const currentDate = Date.now();
// Will return a date object with the current date.

console.log(newDate < currentDate);
// Will compare the two dates.
0
ответ дан Simeon Smith 17 August 2018 в 12:42
поделиться
  • 1
    Поэтому, если я прав: мне нужна дата, подобная этой & gt; var eventTime = new Date (event.time) ЕСЛИ мой JSON выглядит так ''event'{ time: ''date in a string'' }' – DavidB 13 July 2018 в 13:47
  • 2
    Это должно сработать. – Simeon Smith 13 July 2018 в 13:49
  • 3
    случайно нажмите Enter несколько раз @ Симеон Смит извините. – DavidB 13 July 2018 в 13:49
  • 4
    Хорошо. Я буду обновлять вас, как только я попробую. Спасибо за помощь – DavidB 13 July 2018 в 13:49
  • 5
    Затем вы можете создать текущую дату с Date.now () и сравнить их. – Simeon Smith 13 July 2018 в 13:50
Другие вопросы по тегам:

Похожие вопросы: