Используйте JS Array.Reduce для определенных свойств массива в цикле for-in - PullRequest
1 голос
/ 06 июня 2019

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

{"2018":[{"leaveYear":2018,"dayValue":60},{"leaveYear":2018,"dayValue":60}], "2019":[{"leaveYear":2019,"dayValue":60}]}

В приведенном выше примере я хочу получить сумму каждого dayValue, но только тогда, когда их leaveYear совпадает. Так что мой результат будет:
2018: 120
2019: 60

Эти данные будут затем сохранены в моей базе данных с ключом leaveYear и уменьшенным значением dayValue в качестве значения

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

function getSum(total, num) {
    return total + num;
    }
//used to total my values

function groupBy(array, property) {
        var hash = {};
        for (var i = 0; i < array.length; i++) {
            if (!hash[array[i][property]]) hash[array[i][property]] = [];
            hash[array[i][property]].push(array[i]);
        }
        return hash;
    }

Который создает массив массивов объектов с совпадающими годами в каждом. Затем, повторяя это снова, я начинаю уменьшать:

var grouped = groupBy(multiSelectSaveArr,'leaveYear')
var multiDeductTotal = []
// my array of arrays by leaveYear

            for(var i in grouped) {
                var splitGroup = grouped[i]
                console.log("SPLITGROUP:" + JSON.stringify(splitGroup))

//my log shows the result of

//SPLITGROUP:[{"leaveYear":2018,"dayValue":60},{"leaveYear":2018,"dayValue":60}]
//SPLITGROUP:[{"leaveYear":2019,"dayValue":60}]
//I then loop through splitGroup to reduce for my desired result by doing the following:

                for(var ix in splitGroup) {
                    multiDeductTotal.push([splitGroup[ix].dayValue])
                }

                var deductReduce = 0 + multiDeductTotal.reduce(getSum)
//signal to database storing data
                calendarPage.amendTakenAllowance(deductReduce, year)
            }


Моя проблема
При этом бывают случаи, когда это работает хорошо, но когда добавляется больше объектов массива или несколько leaveYears, цикл, кажется, иногда пропускает или пропускает числа, только уменьшая некоторые или ни одного значения данного leaveYear

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

Спасибо за любую помощь!

1 Ответ

2 голосов
/ 06 июня 2019

Ваш ввод - это объект, значения которого являются массивами, и вам нужно создать новый объект для каждой пары ключ-значение в исходном объекте.Вы можете сделать это путем .map проверки связи каждого из внутренних массивов с записью, суммирования dayValue s каждого элемента в массиве с .reduce, а затем преобразования обратно в объект с Object.fromEntries:

const input = {
  "2018": [{
    "leaveYear": 2018,
    "dayValue": 60
  }, {
    "leaveYear": 2018,
    "dayValue": 60
  }],
  "2019": [{
    "leaveYear": 2019,
    "dayValue": 60
  }]
};
const sumDays = yearArr => yearArr.reduce((a, b) => a + b.dayValue, 0);
const output = Object.fromEntries(
  Object.values(input).map(yearArr => ([yearArr[0].leaveYear, sumDays(yearArr)]))
);
console.log(output);

Если вы не можете использовать fromEntries, тогда вы можете reduce вместо объекта вывода:

const input = {
  "2018": [{
    "leaveYear": 2018,
    "dayValue": 60
  }, {
    "leaveYear": 2018,
    "dayValue": 60
  }],
  "2019": [{
    "leaveYear": 2019,
    "dayValue": 60
  }]
};
const sumDays = yearArr => yearArr.reduce((a, b) => a + b.dayValue, 0);
const output = Object.values(input).reduce((a, yearArr) => {
  a[yearArr[0].leaveYear] = sumDays(yearArr);
  return a;
}, {});
console.log(output);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...