我真的在破坏我的大脑,所以非常感谢任何帮助。我目前有一个对象数组,每个对象都有两个属性,一个时间戳(自纪元以来的ms)和该时间戳的任意一个。像这样:
[
[1518739200000, 1],
[1518739200000, 1],
[1518739200000, 12],
[1518739200000, 16],
[1518739200000, 16],
[1518825600000, 16],
[1518825600000, 20],
[1518825600000, 20],
[1518825600000, 8],
]
我要做的是将多维数组压缩成另一个多维数组,该数组只有第一个索引的唯一值,时间戳和聚合计数作为第二个值。例如,我正在从上面给出的给定数据集中寻找这个。
[
[1518739200000, 46],
[1518825600000, 64],
]
我尝试过以某种方式使用.reduce,但是对于这种特殊的操作还没有取得任何成功。
答案 0 :(得分:1)
使用函数reduce
let array = [[1518739200000, 1], [1518739200000, 1],[1518739200000, 12],[1518739200000, 16],[1518739200000, 16],[1518825600000, 16],[1518825600000, 20],[1518825600000, 20],[1518825600000, 8]];
let result = Object.values(array.reduce((a, [key, value]) => {
(a[key] || (a[key] = [key, 0]))[1] += value;
return a;
}, {}));
console.log(result);

.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 1 :(得分:0)
使用reduce
var x = [
[1518739200000, 1],
[1518739200000, 1],
[1518739200000, 12],
[1518739200000, 16],
[1518739200000, 16],
[1518825600000, 16],
[1518825600000, 20],
[1518825600000, 20],
[1518825600000, 8],
]
x.reduce(function(ac,d,i,a){if(!ac.some(function(dd,ii){return dd[0] === d[0] && dd[1] === d[1]})){ac.push(d)
}return ac},[]);
以上只为第一个索引获取BOTH索引的唯一值:
x.reduce(function(ac,d,i,a){if(!ac.some(function(dd,ii){return dd[0] === d[0]})){ac.push(d)}return ac},[])
然而,问题是,这是第一个遇到的条目,你对第二个有任何偏好吗?
更新:哦,我没有看到聚集,这是为了它:
x.reduce(function(ac,d,i,a){
var index;
if(
!ac.some(function(dd,ii){
return dd[0] === d[0] ? (index=ii,true) : false
})
){
ac.push(d.slice())
} else {
ac[index][1] += d[1];
}
return ac
},[])
答案 2 :(得分:0)
您可以将reduce数组转换为Map并使用Map使用Array.from创建数组数组。
var data = [
[1518739200000, 1],
[1518739200000, 1],
[1518739200000, 12],
[1518739200000, 16],
[1518739200000, 16],
[1518825600000, 16],
[1518825600000, 20],
[1518825600000, 20],
[1518825600000, 8],
];
console.log(
Array.from(
data.reduce(
(result,[current,num])=>
result.set(
current,
(result.get(current)||0)+num
),
new Map()
)
)
)