У меня есть некоторые JSON, который возвращает несколько дат, как это:

{
  "items": [{
    "metafield1": "May 22 2019"
  }, {
    "metafield1": null
  }, {
    "metafield1": null
  }, {
    "metafield1": "May 20 2019"
  }]
}

Затем я получил вызов ajax, который получает данные и проходит через них, чтобы проверить, не равны ли они нулю

success: function(result) {
        var obj = JSON.parse(result);
                obj = obj["items"];
                for(var i of obj){
    if(i.metafield1 !== null){
        console.log(i.metafield1);
    }
}

Это возвращает что-то вроде этого

22 мая 2019

20 мая 2019 г.

Теперь мне нужно сравнить эти даты и найти самые высокие (самые дальние в будущем). Я знаю, что могу сделать сравнение даты с объектом Date, как

var date1 = May 22 2019
var date2 = May 20 2019

var newdate1 = new Date(date1)
var newdate2 = new Date(date2)
if (newdate1 > newdate2){
   var biggest_date = newdate1
}
else {
   var biggest_date = newdate2
}

Или как то так. Моя проблема заключается в том, как мне назначить их в моем цикле и заставить его работать, если в цикле более двух элементов. Так скажем, мой цикл возвращает это

22 мая 2019

20 мая 2019 г.

20 июля 2019 г.

Как я могу получить и сравнить эти три значения (которые являются динамическими, поэтому их количество варьируется), чтобы найти самую большую дату?

-1
MariaL 3 Май 2019 в 12:42

3 ответа

Лучший ответ

Вы можете попробовать следующее

  • Фильтр {{X0} } массив с ненулевым metafield1
  • Уменьшите полученный массив для возврата объект с самой большой датой
let obj = {"items": [{"metafield1": "May 22 2019"}, {"metafield1": null}, {"metafield1": null}, {"metafield1": "May 20 2019"}, {"metafield1": "June 20 2019"}]};

let biggest_date = obj.items.filter(v => v.metafield1)
                  .reduce((a,c) => new Date(a.metafield1) - new Date(c.metafield1) > 0 ? a : c)
                  .metafield1;
console.log(biggest_date);
0
Nikhil Aggarwal 3 Май 2019 в 09:52
  1. Отфильтруйте нулевое значение с помощью Array#filter .
  2. Затем преобразуйте строку даты в время с помощью new Date().getTime().
  3. Наконец, используйте Math.max() получить наибольшее значение. Затем найти индекс снова получить значение с помощью array[index]
var arr = { "items": [{ "metafield1": "May 22 2019" }, { "metafield1": null }, { "metafield1": null }, { "metafield1": "May 20 2019" }] }

var a =arr.items.map(i=> i.metafield1).filter(i=> i)
var m_arr = a.map(d=> new Date(d).getTime());
var res = a[m_arr.indexOf(Math.max(...m_arr))];

console.log(res)
0
prasanth 3 Май 2019 в 09:56

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

let obj = {"items":[{"metafield1":"May 22 2019"},{"metafield1":null},{"metafield1":null},{"metafield1":"May 20 2019"}]};

let result = obj.items.reduce((c, v) => {
  if (v.metafield1) return new Date(c) > new Date(v.metafield1) ? c : v.metafield1;
  return c;
}, null);

console.log(result);

Короткая версия:

Поскольку new Date(null) приведет к 1970-01-01T00:00:00.000Z, вы также можете:

let obj = {"items":[{"metafield1":"May 22 2019"},{"metafield1":null},{"metafield1":null},{"metafield1":"May 20 2019"}]};

let result = obj.items.reduce((c, v) => new Date(c) > new Date(v.metafield1) ? c : v.metafield1, null);

console.log(result);
0
Eddie 3 Май 2019 в 09:54