AngularJS为MultiBar Chart NVD3准备数据

时间:2018-10-14 13:35:29

标签: angularjs lodash angular-nvd3

我正在调用我的API来获取下面的JSON数组,

11-20

还有我的名字数组,

array = [{"date":1533791167870,"count":1,"name":"James"},{"date":1533791167870,"count":3,"name":"Kane"},{"date":1533791167918,"count":1,"name":"Kane"},{"date":1536203856526,"count":2,"name":"Trent"},{"date":1536217871371,"count":5,"name":"Kane"},{"date":1536217882525,"count":4,"name":"James"}]

我正在使用Lodash库。我想获取我的输出数组,以便每个日期都从name_array映射所有名称,如果有count,则从array中获取count值,否则为0。我期望我的输出数组如下result_array,

name_array = ["Kane","Trent","James","Sam"]

我正在对NVD3 AngularJS MultiBar图表执行此操作。由于我的阵列数据不适用于堆叠视图,但是组视图可以正常工作。 我正在使用AngularJS,Lodash。

我会很感激。

1 个答案:

答案 0 :(得分:0)

您可以通过几个_.map调用来做到这一点:

let result = _.flatten(_.map(_.groupBy(array, 'date'), (existedEntries, date) => {
  let usedNames = _.map(existedEntries, entry => entry.name);
  let namesDiff = _.difference(name_array, usedNames);
  let dateNumeric = parseFloat(date);
  let enrichedNames = _.map(namesDiff, name => {
    return {
      date: dateNumeric,
      count: 0,
      name: name
    };
  });
  return _.union(existedEntries, enrichedNames);
}));

首先,我们按日期对现有条目进行分组,并为每个组确定在那里使用的名称。然后,我们计算所有可能的名称与组中使用的名称之间的差异。对于差异中的每个名称,我们将其映射到默认对象中,count: 0date等于当前现有组的日期。接下来,我们将组的现有值与丰富名称diff后得到的值进行合并。最终的flatten调用删除了时间内部数组结构。

如果您使用的是ES5或更低版本,请用功能替换arrow语法糖,并用let(即var

替换var usedNames = _.map(existedEntries, function(entry) {return entry.name;});

P.S。在ES6中,您可以将Lodash map函数替换为同名的本机函数,即let usedNames = existedEntries.map(entry => entry.name);