按名称组织对象

时间:2016-05-10 15:43:17

标签: javascript d3.js

获取下面的对象数组" toursByHotels" - 我想获取这些数据并得到每个具有相同名称的对象(酒店的名称,即万豪等)的旅行总和。

在d3中是否有一种比使用相同名称创建5个新数组更简单的方法,然后对这些数组进行总结?



var toursByHotel = [
        {
          "name": "Marriott",
          "month": 1,
          "tours": 10
        },
        {
          "name": "Marriott",
          "month": 2,
          "tours": 15
        },
        {
          "name": "Marriott",
          "month": 3,
          "tours": 8
        },
        {
          "name": "Marriott",
          "month": 4,
          "tours": 12
        },
        {
          "name": "Marriott",
          "month": 5,
          "tours": 18
        },
        {
          "name": "Marriott",
          "month": 6,
          "tours": 25
        },
        {
          "name": "Marriott",
          "month": 7,
          "tours": 40
        },
        {
          "name": "Marriott",
          "month": 8,
          "tours": 33
        },
        {
          "name": "Marriott",
          "month": 9,
          "tours": 25
        },
        {
         "name": "Marriott",
          "month": 10,
          "tours": 21
        },
        {
         "name": "Marriott",
          "month": 11,
          "tours": 18
        },
        {
         "name": "Marriott",
          "month": 12,
          "tours": 14
        },
        {
          "name": "Springhill",
          "month": 1,
          "tours": 10
        },
        {
          "name": "Springhill",
          "month": 2,
          "tours": 15
        },
        {
          "name": "Springhill",
          "month": 3,
          "tours": 8
        },
        {
          "name": "Springhill",
          "month": 4,
          "tours": 12
        },
        {
          "name": "Springhill",
          "month": 5,
          "tours": 18
        },
        {
          "name": "Springhill",
          "month": 6,
          "tours": 25
        },
        {
          "name": "Springhill",
          "month": 7,
          "tours": 40
        },
        {
          "name": "Springhill",
          "month": 8,
          "tours": 33
        },
        {
          "name": "Springhill",
          "month": 9,
          "tours": 25
        },
        {
         "name": "Springhill",
          "month": 10,
          "tours": 21
        },
        {
         "name": "Springhill",
          "month": 11,
          "tours": 18
        },
        {
         "name": "Springhill",
          "month": 12,
          "tours": 14
        },
        {
          "name": "Residence",
          "month": 1,
          "tours": 10
        },
        {
          "name": "Residence",
          "month": 2,
          "tours": 15
        },
        {
          "name": "Residence",
          "month": 3,
          "tours": 8
        },
        {
          "name": "Residence",
          "month": 4,
          "tours": 12
        },
        {
          "name": "Residence",
          "month": 5,
          "tours": 18
        },
        {
          "name": "Residence",
          "month": 6,
          "tours": 25
        },
        {
          "name": "Residence",
          "month": 7,
          "tours": 40
        },
        {
          "name": "Residence",
          "month": 8,
          "tours": 33
        },
        {
          "name": "Residence",
          "month": 9,
          "tours": 25
        },
        {
         "name": "Residence",
          "month": 10,
          "tours": 21
        },
        {
         "name": "Residence",
          "month": 11,
          "tours": 18
        },
        {
         "name": "Residence",
          "month": 12,
          "tours": 14
        },
        {
          "name": "Courtyard",
          "month": 1,
          "tours": 10
        },
        {
          "name": "Courtyard",
          "month": 2,
          "tours": 15
        },
        {
          "name": "Courtyard",
          "month": 3,
          "tours": 8
        },
        {
          "name": "Courtyard",
          "month": 4,
          "tours": 12
        },
        {
          "name": "Courtyard",
          "month": 5,
          "tours": 18
        },
        {
          "name": "Courtyard",
          "month": 6,
          "tours": 25
        },
        {
          "name": "Courtyard",
          "month": 7,
          "tours": 40
        },
        {
          "name": "Courtyard",
          "month": 8,
          "tours": 33
        },
        {
          "name": "Courtyard",
          "month": 9,
          "tours": 25
        },
        {
         "name": "Courtyard",
          "month": 10,
          "tours": 21
        },
        {
         "name": "Courtyard",
          "month": 11,
          "tours": 18
        },
        {
         "name": "Courtyard",
          "month": 12,
          "tours": 14
        },
        {
          "name": "Renaissance",
          "month": 1,
          "tours": 10
        },
        {
          "name": "Renaissance",
          "month": 2,
          "tours": 15
        },
        {
          "name": "Renaissance",
          "month": 3,
          "tours": 8
        },
        {
          "name": "Renaissance",
          "month": 4,
          "tours": 12
        },
        {
          "name": "Renaissance",
          "month": 5,
          "tours": 18
        },
        {
          "name": "Renaissance",
          "month": 6,
          "tours": 25
        },
        {
          "name": "Renaissance",
          "month": 7,
          "tours": 40
        },
        {
          "name": "Renaissance",
          "month": 8,
          "tours": 33
        },
        {
          "name": "Renaissance",
          "month": 9,
          "tours": 25
        },
        {
         "name": "Renaissance",
          "month": 10,
          "tours": 21
        },
        {
         "name": "Renaissance",
          "month": 11,
          "tours": 18
        },
        {
         "name": "Renaissance",
          "month": 12,
          "tours": 14
        }
      ];




2 个答案:

答案 0 :(得分:1)

您可以使用reduce并返回对象,其中每个键都是酒店名称,值是旅游总和。 DEMO

data = data.reduce(function(obj, e) {
  obj[e.name] = (obj[e.name] || 0) + e.tours;
  return obj;
}, {});

console.log(data)

如果您想获得每家酒店的总和和百分比,您可以这样做DEMO

var result = {}

var total = data.reduce((a, b) => {return a + b.tours }, 0);
data.forEach(function(e) {
  if(!this[e.name]) {
    this[e.name] = {sum: e.tours, percentage: 0}
    result[e.name] = this[e.name];
  }
  this[e.name].sum += e.tours;
  this[e.name].percentage = (this[e.name].sum / total)*100;
}, {});

console.log(result)

答案 1 :(得分:1)

使用reduce是最好的方法:

Working Example

// lets keep track of the total here:
var total = 0;

var totals = a.reduce(function(curr, next) {
  curr[next.name] = (curr[next.name] || 0) + next.tours;
  // increment total here:
  total += next.tours;
  return curr;
}, {});

for (var hotel in totals) {
  var obj = {};
  obj.name = totals[hotel];
  obj.percentage = (totals[hotel] / total) * 100 + '%';
  totals[hotel] = obj;
}

MDN docs on .reduce