Как получить правильную сумму массива в массиве? - PullRequest
0 голосов
/ 24 марта 2020

У нас есть следующие initialDataSet

0: {ID: 1, Province/State: "", Country/Region: "Thailand", Lat: 15, Long: 101, …}
1: {ID: 2, Province/State: "", Country/Region: "Japan", Lat: 36, Long: 138, …}
2: {ID: 3, Province/State: "", Country/Region: "Singapore", Lat: 1.2833, Long: 103.8333, …}
...

Внутри каждого из них у нас есть:

0:
ID: 1
Province/State: ""
Country/Region: "Thailand"
Lat: 15
Long: 101
data: (62) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {

И внутри каждого data: У нас есть:

data: Array(62)
0: {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0}
1: {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0}
2: {date: "1/24/20", Confirmed: 5, Deaths: 0, Recovered: 0}

И нам нужно получить total sum of Deaths

Мы сделали:

const initialDataSet = [
{ID: 1, "Province/State": "", "Country/Region": "Thailand", Lat: 15, Long: 101, data : [  {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: 0, Recovered: 0}
]},
 {ID: 2, "Province/State": "", "Country/Region": "Japan", Lat: 36, Long: 138, data : [ {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: 0, Recovered: 0}
]},
 {ID: 3, "Province/State": "", "Country/Region": "Singapore", Lat: 1.2833, Long: 103.8333, data: [ {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: 0, Recovered: 0}
]}
];


var testTotals = [];
for (var d = 0; d < initialDataSet.length; d++) {
  var trackObj = initialDataSet[d];
  for (var c = 0; c < trackObj.data.length; c++) {
    testTotals.push(parseInt(trackObj.data[c].Deaths));
  }
}
var myTots = testTotals.reduce((a, b) => a + b, 0);
console.log(myTots);

Но консоль дает NaN

Ответы [ 4 ]

2 голосов
/ 24 марта 2020

Учитывая (большой) набор данных , над которым вы работаете, может быть извлечена следующая дополнительная информация:

  1. Временные ряды являются инкрементными, что означает, что последнее значение массива data - это общее число в данный момент времени; это уменьшает одну внутреннюю l oop
  2. Если последнее значение массива data является пустой строкой, перед ним нет положительного целого числа, что означает, что вы можете просто привести это значение, используя || 0

Я настроил ваш набор данных, чтобы выделить эти выводы, и соответственно изменил решение.

const initialDataSet = [
{ID: 1, "Province/State": "", "Country/Region": "Thailand", Lat: 15, Long: 101, data : [  {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: '', Recovered: 0}
]},
 {ID: 2, "Province/State": "", "Country/Region": "Japan", Lat: 36, Long: 138, data : [ {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 2, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: 3, Recovered: 0}
]},
 {ID: 3, "Province/State": "", "Country/Region": "Singapore", Lat: 1.2833, Long: 103.8333, data: [ {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 0, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: '', Recovered: 0}
]}
];

const x = initialDataSet.reduce((total, {data}) => {
  const lastItem = data[data.length - 1]
  // it's unlikely, but possible that `data` is an empty array
  return lastItem ? total + (lastItem.Deaths || 0) : total
}, 0)
console.log(x);
1 голос
/ 24 марта 2020

Вы можете уменьшить с помощью вложенного подхода.

const
    initialDataSet = [{ ID: 1, "Province/State": "", "Country/Region": "Thailand", Lat: 15, Long: 101, data: [{ date: "1/22/20", Confirmed: 2, Deaths: '', Recovered: 0 }, { date: "1/23/20", Confirmed: 3, Deaths: 2, Recovered: 0 }, { date: "1/24/20", Confirmed: 5, Deaths: 3, Recovered: 0 }] }, { ID: 2, "Province/State": "", "Country/Region": "Japan", Lat: 36, Long: 138, data: [{ date: "1/22/20", Confirmed: 2, Deaths: 2, Recovered: 0 }, { date: "1/23/20", Confirmed: 3, Deaths: 4, Recovered: 0 }, { date: "1/24/20", Confirmed: 5, Deaths: 5, Recovered: 0 }] }, { ID: 3, "Province/State": "", "Country/Region": "Singapore", Lat: 1.2833, Long: 103.8333, data: [{ date: "1/22/20", Confirmed: 2, Deaths: 1, Recovered: 0 }, { date: "1/23/20", Confirmed: 3, Deaths: 2, Recovered: 0 }, { date: "1/24/20", Confirmed: 5, Deaths: 3, Recovered: 0 }] }]
    total = initialDataSet.reduce((sum, { data }) =>
        data.reduce((s, { Deaths }) => s + (Deaths || 0), sum), 0);

console.log(total);
1 голос
/ 24 марта 2020

Добавьте простой тест к вашему l oop:

var testTotals = [];
for (var d = 0; d < initialDataSet.length; d++) {
  var trackObj = initialDataSet[d];
  for (var c = 0; c < trackObj.data.length; c++) {
    testTotals.push(parseInt(trackObj.data[c].Deaths || 0));
  }
}
var myTots = testTotals.reduce((a, b) => a + b, 0);
console.log(myTots);

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

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

var testTotals = [];
for (var d = 0; d < initialDataSet.length; d++) {
  var trackObj = initialDataSet[d];
  for (var c = 0; c < trackObj.data.length; c++) {
    let value = +trackObj.data[c].Deaths;
    if (!isNaN(value))
      testTotals.push(value);
  }
}
var myTots = testTotals.reduce((a, b) => a + b, 0);
console.log(myTots);

Это также обрабатывает записи с Deaths: "N/A" или другими нечисловыми c, непустыми строками.

1 голос
/ 24 марта 2020

Похоже, что данные являются инкрементными, поэтому вы должны суммировать только последние.
Вы можете сделать это с reduce.

И обрабатывать NaN с, вы можете использовать ~~ (двойное двоичное не), которое приводит значения к целым числам.

const initialDataSet = [
{ID: 1, "Province/State": "", "Country/Region": "Thailand", Lat: 15, Long: 101, data : [  
 {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: "", Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: 0, Recovered: 0}
]},
 {ID: 2, "Province/State": "", "Country/Region": "Japan", Lat: 36, Long: 138, data : [
 {date: "1/22/20", Confirmed: 2, Deaths: 'none', Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: "0", Recovered: 0},
 {date: "1/24/20", Confirmed: 5,              Recovered: 0}
]},
 {ID: 3, "Province/State": "", "Country/Region": "Singapore", Lat: 1.2833, Long: 103.8333, data: [
 {date: "1/22/20", Confirmed: 2, Deaths: 0, Recovered: 0},
 {date: "1/23/20", Confirmed: 3, Deaths: 1, Recovered: 0},
 {date: "1/24/20", Confirmed: 5, Deaths: "2", Recovered: 0}
]}
];


var deathsTotals = initialDataSet.reduce((t, {data}) => t + ~~data[data.length-1].Deaths, 0);
  
console.log(deathsTotals)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...