Я пытаюсь получить измененный объект данных, переданный в функцию 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))@НикПарсонс Как? Функция находится внутри обратного вызова
@mplungjan Я думал, они пытаются вызвать readJSON, а потом пытаются вернуться оттуда, может быть...
@Emilis Можете ли вы привести примеры значения data - не объекта json, а строки, которую вы читаете из файла?
@chatnoir добавил файл в описание.
Я сделал вам фрагмент - каков ожидаемый результат? Если все верно, то проблема в файле fs.readFile — какие-либо ошибки консоли? Обычно вам не разрешается использовать fs.readFile на веб-странице.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


В вашей функции 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].
Возможный дубликат Как вернуть ответ на асинхронный вызов?