Удалите объекты JSON с уже прошедшей датой - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь отсортировать сообщения блогов Shopify по метафизу «Дата события».Я вызываю мои статьи. JSON, но они не поставляются с metafields.JSON, поэтому мне нужно взять этот массив и поместить его через функцию foreach, чтобы присоединить мета-поля к каждой статье.

Вот как настроен metafields.json для каждой статьи:

{  
   "metafields":[  
      {  
         "id":5994805788772,
         "namespace":"global",
         "key":"Event-Date",
         "value":"1549256400",
         "value_type":"string",
         "description":null,
         "owner_id":15977611364,
         "created_at":"2019-02-06T18:31:44-05:00",
         "updated_at":"2019-02-06T18:31:44-05:00",
         "owner_resource":"article"
      },
      {  
         "id":5994805821540,
         "namespace":"global",
         "key":"Event-Time",
         "value":"6:00pm - 8:00pm",
         "value_type":"string",
         "description":null,
         "owner_id":15977611364,
         "created_at":"2019-02-06T18:31:45-05:00",
         "updated_at":"2019-02-06T18:31:45-05:00",
         "owner_resource":"article"
      },
      {  
         "id":6010564542564,
         "namespace":"global",
         "key":"Location",
         "value":"18th Street Location",
         "value_type":"string",
         "description":null,
         "owner_id":15977611364,
         "created_at":"2019-02-07T13:16:05-05:00",
         "updated_at":"2019-02-07T14:05:08-05:00",
         "owner_resource":"article"
      }
   ]
}

Как я прикрепляю мета поля.JSON ниже:

var request = new XMLHttpRequest();

request.open('GET', '/admin/blogs/43130421348/articles.json');
request.responseType = 'json';
request.send();

request.onload = function() {
    var articleList = request.response; 
    var articleArray = articleList.articles;
    var date = new Date();
    var ticks = Math.floor(date.getTime() / 1000);
    var count = 0;
    articleArray.forEach(function(entry,index, object){
    var metaRequest = new XMLHttpRequest();
    metaRequest.open('GET', '/admin/blogs/43130421348/articles/'+ entry.id + '/metafields.json');
    metaRequest.responseType = 'json';
    metaRequest.send();
    console.log(index);

    metaRequest.onload = function() {
        var articleMetaObj = metaRequest.response;
        var articleMetaArr = articleMetaObj.metafields;
        entry.metafields = articleMetaArr; 
        var eventDate = entry.metafields[0].value;
   }

 });

};

Я сейчаспытаясь избавиться от любой статьи, у которой есть дата («Ключ»: «Дата события»), которая уже прошла по сравнению с текущей датой.Я рассмотрел следующую Пост переполнения стека об удалении объектов в цикле foreach, но ни одно из его решений не доказывает фактического избавления от всех статей.Он будет время от времени избавляться от них, но иногда уходит в один из объектов.

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

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

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

Вариант 1 - Старые пути (setInterval)

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

var request = new XMLHttpRequest();

request.open('GET', '/admin/blogs/43130421348/articles.json');
request.responseType = 'json';
request.send();

request.onload = function () {
    var articleList = request.response;
    var articleArray = articleList.articles;
    var date = new Date();
    var ticks = Math.floor(date.getTime() / 1000);
    var count = 0;  //to keep track of how many metafields have been retrieved
    var checkInterval = null;

    articleArray.forEach(function (entry, index) {
        var metaRequest = new XMLHttpRequest();
        metaRequest.open('GET', '/admin/blogs/43130421348/articles/' + entry.id + '/metafields.json');
        metaRequest.responseType = 'json';
        metaRequest.send();
        console.log(index);

        metaRequest.onload = function () {
            var articleMetaObj = metaRequest.response;
            var articleMetaArr = articleMetaObj.metafields;
            entry.metafields = articleMetaArr;
            count++;
        };
    });

    //Function to continue processing
    var finish = function () {
        articleArray = articleArray.filter(a => new Date(a.metafields[0].value).getTime() < date.getTime());
        //Continue on...
    };

    //Wait until all metafields are retrieved to continue
    checkInterval = setInterval(function () {
        if (count === articleArray.length - 1) {
            clearInterval(checkInterval);
            finish();
        }
    }, 500);
};

Вариант 2 - Новый Razmatazz (Promises & async / await)

Обещания и async / await позволяют писать более приятный на вид код при работе с асинхронными операциями.

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

//Functions that return Promises can be awaited...
var get = url => new Promise((resolve, reject) => {
    var request = new XMLHttpRequest();
    request.open('GET', url);
    request.responseType = 'json';
    //resolve is called when successful
    request.onload = () => resolve(request.response);
    //reject is called when there's a problem
    request.onerror = err => reject(err);
    request.send();
});

//await keyword must appear in an async function
var getArticles = async () => {
    var articleList = await get('/admin/blogs/43130421348/articles.json');
    return articleList.articles;
};

//Promise.all takes an array of promises and resolves when all of them are finished
//This lets you skip the messy setInterval stuff
var getArticleMetafields = async articles => {
    var requests = [];
    articles.forEach(a => {
        var url = '/admin/blogs/43130421348/articles/' + a.id + '/metafields.json';
        var promise = get(url);
        requests.push(promise);
    });
    var responses = await Promise.all(requests);
    responses.forEach((response, i) => {
        articles[i].metafields = response.metafields;
    });
    return articles;
};

//Notice the async on the handler
document.addEventListener('DOMContentLoaded', async () => {
    var articles = await getArticles();
    articles = await getArticleMetafields(articles);
    var date = new Date();
    articles = articles.filter(a => new Date(a.metafields[0].value) < date);
    //Continue...
});

Надеюсь, это поможет.Ура!

0 голосов
/ 12 февраля 2019

Ваша статья - статья?Тогда вы можете игнорировать, используя:

request.onload = function() {
var articleList = request.response; 
var articleArray = articleList.articles;
var date = new Date();
var ticks = Math.floor(date.getTime() / 1000);
var count = 0;
articleArray.forEach(function(entry,index, object){
   if(entry.'Key' !== 'Event-Date'){
        var metaRequest = new XMLHttpRequest();
        metaRequest.open('GET', '/admin/blogs/43130421348/articles/'+ entry.id + '/metafields.json');
        metaRequest.responseType = 'json';
        metaRequest.send();
        console.log(index);

        metaRequest.onload = function() {
        var articleMetaObj = metaRequest.response;
        var articleMetaArr = articleMetaObj.metafields;
        entry.metafields = articleMetaArr; 
        var eventDate = entry.metafields[0].value;
       }
   }
});
...