Отображение и уменьшение объектов JSON с помощью JavaScript

Рассмотрим этот объект JSON ниже:

{
   "cells":[
      {
         "count":"1",
         "gdp_growth__avg":1.90575802503285,
         "geo__name":"united states of america",
         "time":1990
      },
      {
         "count":"1",
         "gdp_growth__avg":9.17893670154459,
         "geo__name":"china",
         "time":1991
      },
      {
         "count":"1",
         "gdp_growth__avg":-5.04693945214571,
         "geo__name":"russia",
         "time":1991
      },
      {
         "count":"1",
         "gdp_growth__avg":-0.0622142217811472,
         "geo__name":"botswana",
         "time":1991
      },
      {
         "count":"1",
         "gdp_growth__avg":14.2407063986337,
         "geo__name":"china",
         "time":1992
      },
      {
         "count":"1",
         "gdp_growth__avg":-14.5310737731921,
         "geo__name":"russia",
         "time":1992
      },
      {
         "count":"1",
         "gdp_growth__avg":3.55494453739944,
         "geo__name":"united states of america",
         "time":1992
      },
      {
         "count":"1",
         "gdp_growth__avg":13.9643147001603,
         "geo__name":"china",
         "time":1993
      },
      {
         "count":"1",
         "gdp_growth__avg":-8.66854034194856,
         "geo__name":"botswana",
         "time":1993
      },
      {
         "count":"1",
         "gdp_growth__avg":2.74204850437989,
         "geo__name":"united states of america",
         "time":1993
      },
      {
         "count":"1",
         "gdp_growth__avg":4.04272516401846,
         "geo__name":"united states of america",
         "time":1994
      },
      {
         "count":"1",
         "gdp_growth__avg":13.0806818010789,
         "geo__name":"china",
         "time":1994
      },
      {
         "count":"1",
         "gdp_growth__avg":-12.5697559787493,
         "geo__name":"russia",
         "time":1994
      },
      {
         "count":"1",
         "gdp_growth__avg":10.9249803004994,
         "geo__name":"china",
         "time":1995
      },
      {
         "count":"1",
         "gdp_growth__avg":-4.14352840666389,
         "geo__name":"russia",
         "time":1995
      },
      {
         "count":"1",
         "gdp_growth__avg":2.71655384149574,
         "geo__name":"united states of america",
         "time":1995
      },
      {
         "count":"1",
         "gdp_growth__avg":10.0085233990531,
         "geo__name":"china",
         "time":1996
      },
      {
         "count":"1",
         "gdp_growth__avg":3.79848988541973,
         "geo__name":"united states of america",
         "time":1996
      }
]
}

Я хотел бы отобразить и уменьшить и создать новый объект, содержащий суммирование роста ВВП для всех стран в приведенном выше JSON, который может выглядеть примерно так:

{  
  {
     "gdp_growth__avg":46.23,
     "geo__name":"united states of america",
  },
  {
     "gdp_growth__avg":16.23,
     "geo__name":"china",
  },
  {
     "gdp_growth__avg":36.23,
     "geo__name":"russia",
  },
  {
     "gdp_growth__avg":26.23, 
     "geo__name":"botswana",
     "time":1991
  }
 }

Я посмотрел карту и уменьшить и не уверен как лучше поступить.

Я думал, что что-то подобное может двигаться в правильном направлении, но, похоже, не выполняет то, что я ожидал:

      var arr = [{x:1},{x:2},{x:4}];

      arr.reduce(function (a, b) {
        return {x: a.x + b.x};
      });

      console.log(arr); //Outputs that same initial array

Хотя я признаю, что, вероятно, лучше и проще делать это на стороне сервера, мне интересно, можно ли сделать то, что я пытаюсь сделать, на стороне клиента с помощью JavaScript. Какие-либо предложения? Заранее спасибо.

7 голосов | спросил Mr. Concolato 1 TueEurope/Moscow2015-12-01T03:03:22+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 03:03:22 +0300 2015, 03:03:22

3 ответа


0

Попробуйте это:

var data = { cells:[...] };

var r = data.cells.reduce(function(pv, cv) {
    if ( pv[cv.geo__name] ) {
        pv[cv.geo__name] += cv.gdp_growth__avg;
    } else {
        pv[cv.geo__name] = cv.gdp_growth__avg;
    }
    return pv;
}, {});

console.log(r);

Пример вывода:

    { 
      'united states of america': 18.76051995774611,
      'china': 71.39814330096999,
      'russia': -36.291297610751,
      'botswana': -8.730754563729707 
   }
ответил marsgpl 1 TueEurope/Moscow2015-12-01T04:03:21+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 04:03:21 +0300 2015, 04:03:21
0

Метод Array.reduce не меняет объект массива, он возвращает результаты в новом массиве.

ответил Mike Baranczak 1 TueEurope/Moscow2015-12-01T03:10:42+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 03:10:42 +0300 2015, 03:10:42
0

Вы можете попробовать что-то вроде этого:

var data = {"cells": [...]};

data.cells.map(function(datum) {
  return {
    geo__name: datum.geo__name,
    gdp_growth__avg: data.cells.filter(function(o) {
      return o.geo__name === datum.geo__name;
    }).reduce(function(sum, o) {
      return sum + o.gdp_growth__avg;
    }, 0)
  };
})

Излишне говорить, что вы также можете извлечь другие свойства из datum, например time. У меня нет.

ответил Hunan Rostomyan 1 TueEurope/Moscow2015-12-01T03:15:51+03:00Europe/Moscow12bEurope/MoscowTue, 01 Dec 2015 03:15:51 +0300 2015, 03:15:51

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132