如何使用JavaScript循环遍历键、值,并在另一个键匹配时累加一个键的值

3
我有一个数据集,记录看起来像这样:

[{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":3
},
{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":1
}
]

每个记录中的ct值都会发生变化。如果一个或多个记录中的d1d、d1h和d15m相同,则需要将这些记录合并为一个记录,并计算所有ct值的总和。

我有jquery,我可以使用grep吗?

我意识到服务器端可以更好地获取这些数据,但我对此没有任何控制。

2个回答

4

您不必使用jQuery,纯JavaScript即可。 我将向您展示两种解决方案;

示例1:滥用Array#reduce作为迭代器

var intermediaryArray = [];
dataset.reduce(function(prev, curr) {
  if(prev.d1d === curr.d1d && prev.d1h === curr.d1h && prev.d15m === curr.d15m) {
    intermediaryArray.push({
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    });
  } else {
    // push the one that wasn't the same
    intermediaryArray.push(curr);
  }
  // return current element so reduce has something to work on
  // for the next iteration.
  return curr;
});

示例2: 结合使用Array#Map和Array#Reduce

本示例利用underscore.js演示所需逻辑。

.map()生成新的对象组数组。 .groupBy()生成包含通过谓词共享相同d1d或分组函数的所有对象的子数组的数组。 .reduce()将所有子数组归约为一个值,该值是您的对象,其中两个ct已加在一起。

var merged = _.map(_.groupBy(a, 'd1d'), function(subGroup) {
  return subGroup.reduce(function(prev, curr) {
    return {
      d1d: prev.d1d,
      d1h: prev.d1h,
      d15m: prev.d15m,
      ct: prev.ct + curr.ct
    };
  });
});

这很完美。谢谢! - Jason
你能否在JS在线编辑器中进行修改并测试?按照现有的方式只会从数组中删除一个记录,但我有100个以上的记录需要处理,并且其中很多是匹配的。 - Jason

1
这是一个可能的解决方案:
var dataset = [{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":3
},
{
 "d1d":"2015-05-28T00:00:00.000Z",
 "d1h":0,
 "d15m":0,
 "ct":1
}
]

function addCt(dataset) {
  var ctMap = {}
  var d1d, d1h, d15m, ct, key, value
  for (var ii=0, record; record=dataset[ii]; ii++) {
    key = record.d1d+"|"+record.d1h+"|"+record.d15m
    value = ctMap[key]
    if (!value) {
      value = 0
    }
    value += record.ct
    ctMap[key] = value
  }

  return ctMap
}

ctMap = addCt(dataset)
console.log(ctMap)
// { "2015-05-28T00:00:00.000Z|0|0": 4 }

您可能希望以不同的方式构建密钥。您可以将值设置为包含d1d、d1h、d15m和累积ct值的对象,对于所有匹配的d1d、d1h和d15m值,使用单个对象。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接