Как суммировать строки с одинаковой датой в JavaScript? - PullRequest
0 голосов
/ 29 октября 2019

Я получаю данные из MySQL. Полученные данные выглядят примерно так перед тем, как я их проанализирую:

[
  { "reps": 5, "kg": 10, "exercise": "Leg Curl",    "date": "14/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Biceps Curl", "date": "15/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Dips",        "date": "16/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Dips",        "date": "16/10/2019" }
]

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

Ответы [ 5 ]

1 голос
/ 29 октября 2019

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

var data = [
  {"reps":5,"kg":10,"exercise":"Leg Curl","date":"14/10/2019"},
  {"reps":5,"kg":10,"exercise":"Biceps Curl","date":"15/10/2019"},
  {"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"},
  {"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"}
]


var updated = Object.values(data.reduce((obj, item) => {
  var key = item.exercise + item.date
  if (!obj[key]) {
    obj[key] = Object.assign(item)
  } else {
    obj[key].reps += item.reps
  }
  return obj
}, {}))

console.log(updated)
1 голос
/ 29 октября 2019

это лучше разрешить с помощью mysql, просто group и sum:

SELECT sum(reps), sum(kg) FROM exercises GROUP BY date, exercise

, если вы хотите сделать это с помощью javascript, создайте объект с ключом date и Упражнение заполнено вашими данными, затем снова выведите ваши данные и суммируйте количество повторений и кг.

0 голосов
/ 29 октября 2019

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

var data = [
  { "reps": 5, "kg": 10, "exercise": "Leg Curl",    "date": "14/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Biceps Curl", "date": "15/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Dips",        "date": "16/10/2019" },
  { "reps": 5, "kg": 10, "exercise": "Dips",        "date": "16/10/2019" }
];

const KeyFilter = (keys) => (data) => keys.map(key => data[key]).join('|');

var exerciseFilter = KeyFilter(['date', 'exercise', 'kg']);

console.log(summarizeData(data, exerciseFilter));

function summarizeData(data, keyFn) {
  return data.reduce((results, item, index) => {
    let found = results.find(d => keyFn(d) === keyFn(item));
    if (found) {
      Object.keys(found).forEach(key => {
        let value = found[key];
        if (typeof value !== 'string') {
          found[key] += value; // Only non-string values...
        }
      });
    } else {
      results.push(item); // New entry
    }
    return results;
  }, []);
}
.as-console-wrapper { top: 0; max-height: 100% !important; }
0 голосов
/ 29 октября 2019

Вы можете написать функцию, которая принимает желаемую дату и упражнение в виде строк и добавляет значение к итогу, если они соответствуют записи из данного массива, например:

const data = [{"reps":5,"kg":10,"exercise":"Leg Curl","date":"14/10/2019"},
{"reps":5,"kg":10,"exercise":"Biceps Curl","date":"15/10/2019"},
{"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"},
{"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"}];

function getTotalReps(arr, exercise, date) {
    return { exercise, date, totalReps: arr.reduce((total, entry) => {
        if (entry.exercise === exercise && entry.date === date)
            total += entry.reps;
        return total;
    }, 0) };
}

console.log(getTotalReps(data, 'Dips', '16/10/2019'));
0 голосов
/ 29 октября 2019

Для этого можно использовать lower () .

Итерация по заданным данным, и если элемент с такими же date и exercise в качестве текущего элемента существует, то добавитьreps, иначе добавьте текущий элемент в качестве новой записи.

let data = [{"reps":5,"kg":10,"exercise":"Leg Curl","date":"14/10/2019"},
{"reps":5,"kg":10,"exercise":"Biceps Curl","date":"15/10/2019"},
{"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"},
{"reps":5,"kg":10,"exercise":"Dips","date":"16/10/2019"},{"reps":5,"kg":10,"exercise":"Bench Press","date":"16/10/2019"}];

let result = data.reduce((acc, curr) => {
  let item = acc.find(item => item.date === curr.date && item.exercise === curr.exercise);

  if (item) {
    item.reps += curr.reps;
  } else {
    acc.push(curr);
  }

  return acc;
}, []);

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