比较和转换多个数组
Comparing and converting multiple arrays
在一个应用程序中,我每天都会记录每个用户的点击事件,我想用d3将它们可视化。折线图为每个用户显示一条线。y轴是点击次数的总和,x轴是一天。有些日子,用户不使用该应用程序,因此没有当天的数据。但是d3要求所有数组的长度相同,并且包含相同的数据结构。如何有效地填补空白?
示例数据:
user01: [[01.Jun, 54],[02.Jun, 32], [05.Jun, 14], [07.Jun, 87]]
user02: [[01.Jun, 89],[02.Jun, 4], [03.Jun, 93], [05.Jun, 23], [06.Jun, 57]]
user03: [[03.Jun, 57],[06.Jun, 11], [07.Jun, 45]]
应转换为:
user01: [[01.Jun, 54],[02.Jun, 32], [03.Jun, 0], [05.Jun, 14], [06.Jun, 0], [07.Jun, 87]]
user02: [[01.Jun, 89],[02.Jun, 4], [03.Jun, 93], [05.Jun, 23], [06.Jun, 57], [07.Jun, 0]]
user03: [[01.Jun, 0],[02.Jun, 0], [03.Jun, 57], [05.Jun, 0], [06.Jun, 11], [07.Jun, 45]]
有时某一天没有点击事件,在这个例子中是在04.Jun没有用户在线,所以不需要数据。
我的想法是…
1.)生成所有出现的唯一x值的数组[01.Jun,02.Jun,03.Jun,05.Jun,06.Jun,07.Jun]
2.)检查每个用户的阵列是否有当天的条目
3.),如果不创建具有0的条目。
由于数据是实时更新的,用户数量是可变的:有没有一种有效的方法可以做到这一点,最好是使用ramda?
谢谢你的帮助!
Muff
编辑:日期是日期对象
这不是最有效的解决方案,但我认为它是惯用的Ramda代码:
// data Day = Mon | Tue | Wed | Thu | Fri | Sat | Sun
//
// Day satisfies Ord, the class of orderable types.
const Mon = 1;
const Tue = 2;
const Wed = 3;
const Thu = 4;
const Fri = 5;
const Sat = 6;
const Sun = 7;
// days :: Array Day
const days = [Mon, Tue, Wed, Thu, Fri, Sat, Sun];
// defaultPairs :: Pair Day Integer
const defaultPairs = R.map(day => [day, 0], days);
// fillGaps :: Array (Pair Day Integer) -> Array (Pair Day Integer)
const fillGaps = pairs => {
const toInsert = R.differenceWith(R.eqBy(R.head), defaultPairs, pairs);
return R.sortBy(R.head, R.concat(pairs, toInsert));
};
fillGaps([[Mon, 54], [Tue, 32], [Fri, 14], [Sun, 87]]);
// => [[1, 54], [2, 32], [3, 0], [4, 0], [5, 14], [6, 0], [7, 87]]
这里有一个使用循环的解决方案。它运行良好。我为周四添加了Thu
,我想你可能错过了。但如果您不需要,请将其从days
数组中删除。
var user01 = [
['Mon', 54],
['Tue', 32],
['Fri', 14],
['Sun', 87]
];
var days = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'];
function fillGap(input) {
var data = [];
var index = 0;
days.forEach(function(day) {
if (input[index][0] == day) {
data.push(input[index]);
index++;
} else {
data.push([day, 0]);
}
});
return data;
}
console.log(fillGap(user01));
输出:
[["周一",54],[["周二",32],["周三",0],["周四",0]
我创建了一个jsbin,你可以在那里进行实验。
http://jsbin.com/hunudul/edit?html,js,控制台,输出
相关文章:
- 使用JS将数组转换为json对象
- 本地存储中的字符串到字节数组转换
- Javascript函数,用于将数组转换为“;2-元组”;
- php数组转换为javascript
- 在Javascript中将一个值和字符串数组转换为if语句
- 将数组转换为javascript格式的字符串
- 如何将数组转换为有效的json
- JSON数组转换为JS对象数组
- 如何将数组转换为映射
- JavaScript:将字符串数组转换为文本区域
- javascript |数组转换
- 数组转换为多个字符串
- Javascript将数组转换为字符串并使其反向输出
- 将Byte数组转换为Angularjs中的Base64字符串
- 将对象数组转换为与nodejs/pg/unnest兼容的数组
- 将Javascript数组转换为PHP数组
- 将数组转换为键值对
- 使用Ramda将对象数组转换为普通对象
- javascript将对象数组转换为字符串以存储在s3中
- 使用.join方法将数组转换为不带逗号的字符串