Как получить объект из функции

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

Это для подсчета суммы за последние 7 дней, после подсчета суммы я удаляю первые семь дней, чтобы я мог еще раз подсчитать сумму за 7 дней.

[{ "date": "2016-01-05", "user_id": 1, "user_type": "natural", "type":
"cash_in", "operation": { "amount": 200.00, "currency": "EUR" } },
{ "date": "2016-01-06", "user_id": 2, "user_type": "juridical", "type":
"cash_out", "operation": { "amount": 300.00, "currency": "EUR" } },
{ "date": "2016-01-06", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 30000, "currency": "EUR" } },
{ "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
{ "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 2, "user_type": "juridical", "type":
"cash_in", "operation": { "amount": 1000000.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 3, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
{ "date": "2016-02-15", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 300.00, "currency": "EUR" } }]
readJSON = function() {
  fs.readFile(args, 'utf8', function(err, data) {
    if (err) throw err;
    obj = JSON.parse(data);
    //console.info(obj);
    printResult(obj);
    var sum = countAmountInOneWeek(obj);
    console.info("SUM " + sum[0]);
    console.info("SUM " + sum[1].data);
  });
}

Мне нужно получить измененный объект данных и сумму

function countAmountInOneWeek(data) {
  var recordRemoveIndex;
  var sum = data[0].operation.amount;
  for (var i = 1; i < data.length; i++) {
    var date1 = new Date(data[0].date);
    var date2 = new Date(data[i].date);

    const diffTime = Math.abs(date2.getTime() - date1.getTime());
    const difference = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
    //console.info(diffTime + " Time " + difference);

    if (difference < 7) {
      sum = sum + data[i].operation.amount;
      recordRemoveIndex = i;
    }
  }

  for (var i = 0; i <= recordRemoveIndex; i++) {
    data.shift();
  }
  console.info(data);
  return [sum, data];
}

var data = [{ "date": "2016-01-05", "user_id": 1, "user_type": "natural", "type":
"cash_in", "operation": { "amount": 200.00, "currency": "EUR" } },
{ "date": "2016-01-06", "user_id": 2, "user_type": "juridical", "type":
"cash_out", "operation": { "amount": 300.00, "currency": "EUR" } },
{ "date": "2016-01-06", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 30000, "currency": "EUR" } },
{ "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
{ "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 2, "user_type": "juridical", "type":
"cash_in", "operation": { "amount": 1000000.00, "currency": "EUR" } },
{ "date": "2016-01-10", "user_id": 3, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
{ "date": "2016-02-15", "user_id": 1, "user_type": "natural", "type":
"cash_out", "operation": { "amount": 300.00, "currency": "EUR" } }]

function countAmountInOneWeek(data) {
  var recordRemoveIndex;
  var sum = data[0].operation.amount;
  for (var i = 1; i < data.length; i++) {
    var date1 = new Date(data[0].date);
    var date2 = new Date(data[i].date);

    const diffTime = Math.abs(date2.getTime() - date1.getTime());
    const difference = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
    //console.info(diffTime + " Time " + difference);

    if (difference < 7) {
      sum = sum + data[i].operation.amount;
      recordRemoveIndex = i;
    }
  }

  for (var i = 0; i <= recordRemoveIndex; i++) {
    data.shift();
  }
  return [sum, data];
}

console.info(countAmountInOneWeek(data))

Возможный дубликат Как вернуть ответ на асинхронный вызов?

Nick Parsons 12.05.2019 14:58

@НикПарсонс Как? Функция находится внутри обратного вызова

mplungjan 12.05.2019 15:01

@mplungjan Я думал, они пытаются вызвать readJSON, а потом пытаются вернуться оттуда, может быть...

Nick Parsons 12.05.2019 15:02

@Emilis Можете ли вы привести примеры значения data - не объекта json, а строки, которую вы читаете из файла?

chatnoir 12.05.2019 15:02

@chatnoir добавил файл в описание.

Emilis 12.05.2019 15:18

Я сделал вам фрагмент - каков ожидаемый результат? Если все верно, то проблема в файле fs.readFile — какие-либо ошибки консоли? Обычно вам не разрешается использовать fs.readFile на веб-странице.

mplungjan 12.05.2019 15:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
6
63
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В вашей функции readJSON измените

   console.info("SUM " + sum[0]);
   console.info("SUM " + sum[1].data);

к

console.info(sum[0]); //1032700 
console.info(sum[1][0]); // because sum[1] is [ { date: '2016-02-15',user_id: 1,user_type: 'natural',type: 'cash_out',operation: {amount: 300, currency: 'EUR' } } ]

Затем вы можете использовать или изменять json2 по мере необходимости.

В приведенном ниже коде показано, что он вернет правильные значения.

let json = [{ "date": "2016-01-05", "user_id": 1, "user_type": "natural", "type":
        "cash_in", "operation": { "amount": 200.00, "currency": "EUR" } },
    { "date": "2016-01-06", "user_id": 2, "user_type": "juridical", "type":
            "cash_out", "operation": { "amount": 300.00, "currency": "EUR" } },
    { "date": "2016-01-06", "user_id": 1, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 30000, "currency": "EUR" } },
    { "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
    { "date": "2016-01-07", "user_id": 1, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
    { "date": "2016-01-10", "user_id": 1, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 100.00, "currency": "EUR" } },
    { "date": "2016-01-10", "user_id": 2, "user_type": "juridical", "type":
            "cash_in", "operation": { "amount": 1000000.00, "currency": "EUR" } },
    { "date": "2016-01-10", "user_id": 3, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 1000.00, "currency": "EUR" } },
    { "date": "2016-02-15", "user_id": 1, "user_type": "natural", "type":
            "cash_out", "operation": { "amount": 300.00, "currency": "EUR" } }] ;

//this code should be found within readJSON()
//we just run it straight away using json data above
//********************

var sum =	countAmountInOneWeek(json); 
console.info(sum[0]); //1032700 
console.info(sum[1][0]); // because sum[1] is [ { date: '2016-02-15',user_id: 1,user_type: 'natural',type: 'cash_out',operation: {amount: 300, currency: 'EUR' } } ]
//********************

function countAmountInOneWeek(data){
    var recordRemoveIndex;
    var sum = data[0].operation.amount;
    for(var i = 1; i < data.length; i++){
        var date1 = new Date(data[0].date);
        var date2 = new Date(data[i].date);

        const diffTime = Math.abs(date2.getTime() - date1.getTime());
        const difference = Math.ceil(diffTime / (1000 * 60 * 60 * 24));
        //console.info(diffTime + " Time " + difference);

        if (difference < 7){
            sum = sum + data[i].operation.amount;
            recordRemoveIndex = i;
        }
    }

    for(var i = 0; i <= recordRemoveIndex; i++){
        data.shift();
    }
    //console.info(data);
    return [sum, data];
}

@Emilis всегда пожалуйста! Я отредактировал его, чтобы использовать ваш синтаксис вместо моего, заменив sum[1].data на sum[1][0].

chatnoir 12.05.2019 15:37

Другие вопросы по теме