-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]]

1 人以上の人が同じ時刻 "1299233593000" を持っている場合、"出力" がそれを考慮し、それらを 1 つの配列に "折りたたむ" ことに注意してください。exercisedatetimes個人が「numsets」を持っていない場合、null 値が表示されます。null でない値は、その時点で個人が「numsets」を持っている値です。

JavaScript を使用して変数名 (フレッドが彼の情報と共に listA に投入されたとします) と変数列 (「列」配列から「ウィリアム」を削除でき、それが削除されないと仮定して) を許可しながら、JavaScript を使用して「出力」する最良の方法は何ですか?出力に表示されます)。

理想的なソリューションは、必要な速度と処理において最高のパフォーマンスを発揮することです。

4

1 に答える 1

1

編集:

申し訳ありませんが、あなたの質問を読み違えました。これは実際にはあなたが望んでいることではありません.名前は考慮されていません. しかし、問題が正確に何であるかはまだ完全には明らかではありません。

通常、この種の問題の秘訣は、これまでに収集した情報のマップ (またはネストされたマップ) を保持し、必要に応じて更新することです。マップ キーは通常、マージに必要な情報であるため、ルックアップは効率的です。

私はコードをテストしていません。オブジェクトを行に折りたたむだけです。問題が実際に何であるかに応じて、それが妥当な出発点である場合とそうでない場合があります。

コードは結果の行 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 に答える