Как проводить сравнение данных по объектам на основе сопоставления свойств - PullRequest
0 голосов
/ 01 августа 2020

У меня есть объект javascript, который я скопировал с веб-сайта.

{
  "items": [
    {
      "date": 1596131220030,
      "price": "150,00",
      "title": "Jumper"
    },
    {
      "date": 1596285977851,
      "price": "120,00",
      "title": "Jumper"
    },
    {
      "date": 1596131220030,
      "price": "150,00",
      "title": "Shirt"
    },
    {
      "date": 1596285977851,
      "item": {
      "price": "140,00",
      "title": "Shirt"
      }
    }
  ]
}

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

Мне нужно сопоставить это на основе заголовка элемента.

У меня есть функция, которая преобразует дату в обычную дату, и получает массив на вчера и сегодня. Это работает только для одного предмета. Я не уверен, как сделать это для нескольких предметов, и сравниваю цену.

Как мне это сделать

try {
 const items // THIS IS THE ARRAY ABOVE

items.forEach(item => {
    item.date = convertDateTime(item.date);
    item.item.price = parseInt(item.item.price);
});

const todayArray = items.filter(item => item.date >= convertDateTime(Date.now()));
const today = todayArray[todayArray.length - 1];

let date = new Date();
const yesterdayDate = date.setDate(new Date().getDate() - 1);
let yesterdayArray = items.filter(item => item.date <= convertDateTime(yesterdayDate));
let yesterday = yesterdayArray[yesterdayArray.length - 1];


if(today.item.title === yesterday.item.title){
    const today1 = today.item;
    const yesterday1 = yesterday.item;

    const yesterdayPrice = yesterday1.price;
    const todayPrice = today1.price;

    const priceDifference = (todayPrice - yesterdayPrice);

    let message = '';
    if(todayPrice > yesterdayPrice){
        message = `The price has increased by €${priceDifference} since yesterday`;
    }

    if(todayPrice < yesterdayPrice){
        message = `The price has decreased by €${Math.abs(priceDifference)} since yesterday`;
    }

    if(todayPrice == yesterdayPrice){
        message = `The price has not changed since yesterday`;
    }

    console.log(message);
    
}

}

Ответы [ 2 ]

0 голосов
/ 01 августа 2020

Следующий код реструктурирует ваш объект данных и рассчитывает для каждого из продуктов изменение цены в процентах (свойство change):

const data=
{items: [{date: 1596131220030, price: "150.00", title: "Jumper"},
         {date: 1596285977851, price: "120.00", title: "Jumper"},
         {date: 1596131220030, price: "150.00", title: "Shirt"},
         {date: 1596285977851, price: "140.00", title: "Shirt"}]
};

const prices=data.items.reduce((a,c)=>
  ((a[c.title]=a[c.title]||[]).push({d:new Date(c.date),p:c.price}),a), {});
Object.values(prices).forEach(el=>el.forEach((e,i,a)=>{if(i) e.change=(100*e.p/a[i-1].p-100).toFixed(1)+'%'; }));


console.log(prices)
.as-console-wrapper {max-height:100% !important}
0 голосов
/ 01 августа 2020

Прямо сейчас есть несколько элементов с одинаковым заголовком, поэтому сравнение на основе заголовка не сработает.

Другая проблема заключается в том, что ваш скребок, похоже, возвращает элементы с несовместимой структурой. У некоторых есть внутренний объект item {}, а у других его нет. Вы должны убедиться, что скребок постоянно возвращает объекты, прежде чем делать что-то еще.

 {
  "date": 1596285977851,
  "item": { <---  open: this extra level is not in all the objects
  "price": "140,00",
  "title": "Shirt"
  } <-- close
}

Если бы элементы имели уникальные заголовки, работало бы следующее:

const yesterday = {
  "items": [
    {
      "date": 1596131220030,
      "price": 150,
      "title": "Jumper"
    },
    {
      "date": 1596285977851,
      "price": 120,
      "title": "Jumper"
    },
    {
      "date": 1596131220030,
      "price": 150,
      "title": "Shirt1"
    },
    {
      "date": 1596285977851,
      "price": 140,
      "title": "Shirt2"
    }
  ]
}


const today = {
  "items": [
    {
      "date": 1596131220030,
      "price": 165,
      "title": "Jumper"
    },
    {
      "date": 1596285977851,
      "price": 130,
      "title": "Jumper"
    },
    {
      "date": 1596131220030,
      "price": 155,
      "title": "Shirt1"
    },
    {
      "date": 1596285977851,
      "price": 130,
      "title": "Shirt2"
    }
  ]
}

for (todaysItem of today.items) {
  const matchingItems = yesterday.items.filter((yesterdaysItem) => yesterdaysItem.title === todaysItem.title)
  if (matchingItems.length !== 1) {
    console.log(matchingItems.length, "matches found for", matchingItems[0].title, "skipping")
    continue;
  }
  const yesterdaysItem = matchingItems[0]
  const priceDifference = (todaysItem.price - yesterdaysItem.price);

  let message = '';
  if(priceDifference > 0){
      message = `The price has increased by €${priceDifference} since yesterday`;
  }

  if(priceDifference < 0){
      message = `The price has decreased by €${Math.abs(priceDifference)} since yesterday`;
  }

  if(priceDifference === 0){
      message = `The price has not changed since yesterday`;
  }
  console.log(yesterdaysItem.title,":", message)
}

То, что я делаю, - это зацикливаю массив элементов с сегодняшнего дня и фильтрую элементы вчерашнего дня на основе точно совпадающего заголовка (вы могли бы очистить идентификатор лучше, чем заглавие). Если совпадений слишком много или их нет, мы пропускаем этот пункт. В случае совпадения рассчитываем разницу в цене и печатаем. (Для ясности я пропустил предварительную обработку)

Общее решение см .: Получение разницы двух json -объектов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...