注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
JavaScript でソリューションを実装する方法は数多くあります。これらの例では、Slate アプリケーションでよく見られるパターンに対応する汎用的なアルゴリズムを紹介します。これらのソリューションの多くは、組み込みの JavaScript ライブラリである Lodash ↗ と Moment ↗ を使用しています。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63/** * 行指向のスキーマを列指向のスキーマ(クエリが返す形式)に変換します。 * 注:配列の最初のオブジェクトには、抽出するすべてのキー(変換後の列)が含まれている必要があります。 * 最初のオブジェクトにすべてのキーのスーパーセットが含まれていない場合は、関数内のコメントアウトされた代替コードを使用できます。 * * 変換前: * [ * { foo : 1, bar : 4, baz : 7 }, * { bar : 5, baz : 8, foo : 2 }, * { foo : 3, baz : 9, bar : 6 } * ] * * 変換後: * { * foo : [1, 2, 3], * bar : [4, 5, 6], * baz : [7, 8, 9] * } * */ function transformRowSchemaToColumnSchema(arr, first_object_has_all_keys=true) { if (_.isEmpty(arr)) { return []; } var orderedKeys; if(first_object_has_all_keys){ // 最初のオブジェクトにすべてのキーが含まれている場合 orderedKeys = _.chain(arr) .first() .keys() .sortBy() .value(); } else { // 一部のオブジェクトにすべてのキーが含まれていない場合の代替処理: orderedKeys = _.uniq(_.flatMap(arr, _.keys)) } var sortKeysBy = function(obj) { return _.zipObject(orderedKeys, _.map(orderedKeys, function(key) { return obj[key]; })); }; var indexToKeyMapping = _.reduce(orderedKeys, function(agg, key, i) { agg[i] = key; return agg; }, {}); var arrayOfRowObjects = _.map(arr, sortKeysBy); var arrayOfRowArrays = _.map(arrayOfRowObjects, function(obj) { return _.values(obj) }); var arrayOfColumnArrays = _.unzip(arrayOfRowArrays); var objectOfColumnArrays = _.reduce(arrayOfColumnArrays, function(agg, columnArr, i) { var key = indexToKeyMapping[i]; agg[key] = columnArr; return agg; }, {}); return objectOfColumnArrays; } var data = {{f_data}} return transformRowSchemaToColumnSchema(data)
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42/** * 列指向のスキーマ(クエリが返す形式)を行指向のスキーマ(多くの場合、{{#each}} ループで使用する形式)に変換します。 * * 変換前: * { * foo : [1, 2, 3], * bar : [4, 5, 6], * baz : [7, 8, 9] * } * * 変換後: * [ * { foo : 1, bar : 4, baz : 7 }, * { foo : 2, bar : 5, baz : 8 }, * { foo : 3, bar : 6, baz : 9 } * ] */ function transformColumnSchemaToRowSchema(data) { var keys = _.keys(data); var arrays = _.values(data); // `data` が SQL クエリから直接取得された場合は、`._response` プロパティを削除します。 // delete data._response; var arrayOfPropertyLists = _.zip.apply(_, arrays); var arrayOfObjects = _.map(arrayOfPropertyLists, function(list) { var obj = {}; _.each(keys, function(key, i) { obj[key] = list[i]; }); return obj; }); return arrayOfObjects; } var data = {{f_data}} return transformColumnSchemaToRowSchema(data)