迭代多维数组并根据第一个索引

时间:2018-05-08 18:56:21

标签: javascript arrays

我真的在破坏我的大脑,所以非常感谢任何帮助。我目前有一个对象数组,每个对象都有两个属性,一个时间戳(自纪元以来的ms)和该时间戳的任意一个。像这样:

[
    [1518739200000, 1], 
    [1518739200000, 1],
    [1518739200000, 12],
    [1518739200000, 16],
    [1518739200000, 16],
    [1518825600000, 16],
    [1518825600000, 20],
    [1518825600000, 20],
    [1518825600000, 8],
]

我要做的是将多维数组压缩成另一个多维数组,该数组只有第一个索引的唯一值,时间戳和聚合计数作为第二个值。例如,我正在从上面给出的给定数据集中寻找这个。

[
    [1518739200000, 46],
    [1518825600000, 64],
]

我尝试过以某种方式使用.reduce,但是对于这种特殊的操作还没有取得任何成功。

3 个答案:

答案 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()
    )
  )
)