我正在调用我的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。
我会很感激。
答案 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: 0
和date
等于当前现有组的日期。接下来,我们将组的现有值与丰富名称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);