2017-01-11 9 views
2

私は、日付の配列を取り、それを配列の配列にグループ化するサービス/ ISO週間による[[],[]]。この機能は期待どおりに機能します。日付配列と整数配列を取得するために角度サービス/ファクトリを拡張し、キーと値のペアを持つ配列を作成する

しかし、サービス/ファクトリを別の配列の配列(通常の整数値)に拡張するにはどうすればいいですか?は、それぞれの日付と値のキーと値のペアを作成します。配列の配列の出力形式は同じですか?

これは私のサービス/工場出荷時の呼び出しです:サービスに渡されたデータは、次のようになり

$scope.weeks = GroupDateRangeService.createArray(timeline_data, time_trend); 

timeline_data: ["2017-01-04","2017-01-05","2017-01-06","2017-01-07","2017-01-08","2017-01-09","2017-01-10","2017-01-11"] 

time_trend: [566, 607, 430, 357, 277, 591, 711, 206] 

結果は次のようになりますこれは:

result: [["2017-01-04": 566,"2017-01-05": 607,"2017-01-06": 430,"2017-01-07": 357,"2017-01-08": 277], ["2017-01-09": 591,"2017-01-10": 711,"2017-01-11": 206]] 
私はあなたの指導をいただければ幸いです

(function() { 
    'use strict'; 

    angular 
     .module('portalDashboardApp') 
     .factory('GroupDateRangeService', GroupDateRangeService); 

    GroupDateRangeService.$inject = []; 

    function GroupDateRangeService() { 

     var service = { 
      createArray: createArray, 
     }; 

     return service; 

     function createArray(data) { 
      var arr = data.map(function (s) { 
       var week = getWeekNumber(parseISOLocal(s)); 
       return week[0] + ('0' + week[1]).slice(-2) + ':' + s; 
      }).sort(); 
      return createGroupedArray(createGroupObject(arr)); 
     }; 

     function createGroupObject(arr) { 

      var groupedObj = arr.reduce(function (result, value) { 

       var b = value.split(':'); 

       if (!result[b[0]]) result[b[0]] = []; 
       result[b[0]].push(b[1]); 

       return result; 

      }, {}); 

      return groupedObj; 
     }; 

     function createGroupedArray(groupedObj) { 

      // Grab arrays in order of week number. Sort keys to maintain order 
      var groupedArray = Object.keys(groupedObj).sort().map(key=>groupedObj[key]); 

      return groupedArray; 
     } 

     /* Helper to get the ISO week number of a date 
     ** @param {Date} date to get week of 
     ** @returns {Array} [year, weekNumber] 
     */ 
     function getWeekNumber(d) { 
      d = new Date(+d); 
      d.setHours(0, 0, 0, 0); 
      d.setDate(d.getDate() + 4 - (d.getDay() || 7)); 
      var yearStart = new Date(d.getFullYear(), 0, 1); 
      var weekNo = Math.ceil((((d - yearStart)/86400000) + 1)/7); 
      return [d.getFullYear(), weekNo]; 
     } 

     /* Parse ISO 8601 format date string to local date 
     ** @param {string} s - string to parse like 2016-12-15 
     ** @returns {Date} 
     */ 
     function parseISOLocal(s) { 
      var b = s.split(/\D/); 
      return new Date(b[0], b[1] - 1, b[2]); 
     } 
    } 

})(); 

これは私のサービス/工場です!

+0

あなた2つの配列? –

+0

私のサービスはこの時点でのみ日付を取得します。私は、機能を拡張し、同様に整数値の配列を渡したいと思います。 – onmyway

答えて

1

あなたの結果はそのように見えることはできませんが、配列を持つことはできませんキーと値のペア。それはオブジェクトの配列の配列でなければなりません。あなたが二番目の引数を取るためにあなたの関数をリファクタリングした場合は、次の操作を行うことができます

function createArray(data, optionalTimeTrend) { 
    var arr = data.map(function (s) { 
     var week = getWeekNumber(parseISOLocal(s)); 
     return week[0] + ('0' + week[1]).slice(-2) + ':' + s; 
    }).sort(); 
    var results = createGroupedArray(createGroupObject(arr)); 
    if (optionalTimeTrend && optionalTimeTrend.length === data.length) { 
     for (var i = 0; i < results.length; i++) { 
      results[i] = results[i].map(function (date, index) { 
       var obj = {}; 
       obj[date] = optionalTimeTrend[index]; 
       return obj; 
      }); 
     } 
    } 
    return results; 
}; 

あなたの結果はこのようになります。あなただけのマージうルーチンを探している

ので
result: [[{"2017-01-04": 566},{"2017-01-05": 607},{"2017-01-06": 430},{"2017-01-07": 357},{"2017-01-08": 277}], [{"2017-01-09": 591},{"2017-01-10": 711},{"2017-01-11": 206}]] 
+0

ああ!明確化と助けをありがとう。私はそれを試して元に戻します。乾杯。 – onmyway

+0

もう一度ありがとうございます - それは期待どおりに動作します。 – onmyway

+0

あなたは大歓迎です。 –

1

が、これはここにあなたのマージルーチンであると考えて(内部対提供配列を使用する方法、および処理命令を切り替える方法を示すように更新):

// These arrays were already made by your service 
let premadeKeys = [ 'pre', 'made', 'keys' ]; 
let premadeVals = [ 'val1', 'val2', 'val3' ]; 

// Formatrules is a naive way to switch how you want it processed, could be any enum etc. 
function mergeArrays (keys = premadeKeys, values = premadeVals, formatRules = 0) { 
    switch (formatRules) { 
     case 0: 
      return keys.map ((d, i) => { 
       let obj = {}; 
       obj [ d ] = values [ i ]; 
       return obj; 
      }); 
     case 1: 
      return keys.map ((d, i) => { 
       let obj = {}; 
       obj [ d ] = values [ i ] + '_TAIL_' + i; 
       return obj; 
      });  

    } 
} 

let arr1 = [ "a", "b", "c" ]; 
let arr2 = [ 1, 2, 3 ]; 
// provided arrays 
console.log (mergeArrays (arr1, arr2)); 
console.log (mergeArrays (arr1, arr2, 1)); 
// pre made arrays 
console.log (mergeArrays ()); 
console.log (mergeArrays (undefined, undefined, 1)); 
+0

ありがとうございます。それはまっすぐに見えます。しかし、私はこれを私のサービスに追加し、2つの値を私のサービスに渡して結果を返すことができますか?私の問題は、サービスがISO週の配列の配列を作成することです。この時点で、キーと値のペアが作成されている可能性が最も高いです。 – onmyway

+1

うーん、ここで少しはっきりしない:サービスを注入すると、メソッドにアクセスすることができます。このメソッドをサービスに追加することができます。サービスを注入したものから、getMergedArrays()を呼び出すだけで、サービスがすでに保持している2つの配列を取得し、これを介して実行し、結果を返します。サービスを注入したコンポーネントはthis.mySvc.getMergedArrays()。 –

+0

を呼び出す必要がありますが、これについてはわかりません;私のサービスは現在、日付の配列を取り、 ISO週:配列の配列が 'mergeArrays'に渡されるのでしょうか、それとも単に2つの配列を受け取り、マージするのですか?もしそうなら、ISO週の配列を作成するサービスの他の機能はどうなりますか?この新しい形式など? – onmyway

関連する問題