-2

假设您有listA, 和一个定义的“列”数组:

var listA = [{
    name: "Mike",
    exercisedateandtime: 1299233593000,
    exercise: "Jumping Jacks",
    numsets: 5
}, {
    name: "Charles",
    exercisedateandtime: 1299233593000,
    exercise: "Swimming",
    numsets: 2
}, {
    name: "Charles",
    exercisedateandtime: 1299233593000,
    exercise: "Swimming",
    numsets: 6
}, {
    name: "Mike",
    exercisedateandtime: 1299237012000,
    exercise: "Running",
    numsets: 5
}, {
    name: "William",
    exercisedateandtime: 1299237320000,
    exercise: "Fishing",
    numsets: 2
}, {
    name: "William",
    exercisedateandtime: 1299237611000,
    exercise: "Motor Boating",
    numsets: 6
}, {
    name: "Charles",
    exercisedateandtime: 1299237611000,
    exercise: "Swimming",
    numsets: 4
}];

var columns = ["Exercise Date", "Mike", "Charles", "William"]

目标是从列表 A 生成单个数组,这样任何匹配的时间都将被“折叠”。在这种情况下,输出应该是:

var output = [[1299233593000, 5, 2, null]
[1299237012000, 6, null, null]
[1299237012000, 6, null, 0]
[1299237320000, null, null, 2]
[1299237320000, null, null, 2]
[1299237611000, null, 4, 6]]

请注意,当一个或多个人具有相同的时间“1299233593000”时,“输出”如何解释它并将它们“折叠”成一个数组。空值显示exercisedatetimes个人没有任何“numsets”的地方。不为空的值是个人当时拥有“numsets”的值。

在允许变量名(比如 Fred 将他的信息放入 listA)和变量列(假设您可以从“columns”数组中删除“William”并且它不会出现在输出中)。

理想的解决方案是在速度和所需处理方面的最佳性能。

4

1 回答 1

1

编辑:

对不起,误读了你的问题。这并没有真正做到你想要的——它没有考虑名称。但我仍然不完全清楚问题到底是什么。

这类问题的诀窍通常是保留迄今为止收集到的信息的地图(或嵌套地图),并根据需要进行更新。map key 通常应该是你需要合并的信息,所以查找效率很高。

我还没有测试过代码,它应该只是将对象折叠成行。根据您的实际问题,它可能是也可能不是一个合理的起点。

该代码将标签放入结果的第 0 行,但应该很容易添加对预定义列表的支持作为起点......

function collapse (array) {
  var labels = [];
  var result = [labels];
  var labelMap = 0;
  var timeMap = {};
  for (var i = 0; i < array.length; i++) {
    var row = [];
    var entry = array[i];
    var time = entry.exercisedateandtime;
    var row = timeMap[time];
    if (row == null) {
      row = [];
      timeMap[time] = row;
      result.push(row);
    }
    for (var key in entry) {
      var index = labelMap[key];
      if (index == null) {
        index = labels.length;
        labels.push(key);
        labelMap[key] = index;
      }
      row[index] = entry[key];
    }
  }
  return result;    
}
于 2013-07-06T20:56:38.203 回答