2017-04-26 65 views
0

我試圖總結每月的門票數量。數組我有:用javascript函數求和函數

[['tickets', 'month','year'], [1, "june",2016],[3, "june",2015],[1, "december",2015]] 

結果我想:

[['year', 'june','december'], [2016,1,0],[2015,3,1]] 

,但我無法弄清楚如何使用JavaScript做。 有幫助嗎? 謝謝,

+6

如何'[ '年', '月', '月']'來呢?你有沒有嘗試過任何東西? –

+0

這當然是可行的,但有更好的數據結構(即對象)來存儲這些數據。你是否鎖定在你想要的輸出中提供的數據結構中? – mhodges

+0

@FelixKling數組中的第一個元素基本上是標題。他們與其他數組元素的數據對齊 – mhodges

回答

0

實際上,你可以得到一些很酷的使用了ES6的特性在這裏(spread syntaxarray destructuring

的想法是創建一個包含年/月/機票總數的對象從您的原始數據源,然後您可以使用該對象將數據映射到您需要的結構,如下所示:

var data = [['tickets', 'month', 'year'], [1, "june", 2016], [3, "june", 2015], [1, "december", 2015]]; 
 

 
function mapTicketData(data) { 
 
    var dataMap = data.slice(1).reduce(function(results, current, index) { 
 
    var [tickets, month, year] = current; 
 
    if (results.months.indexOf(month) === -1) { 
 
     results.months.push(month); 
 
    } 
 
    if (results.years.indexOf(year) === -1) { 
 
     results.years.push(year); 
 
    } 
 
    if (!results[year]) { 
 
     results[year] = {}; 
 
    } 
 
    if (!results[year][month]) { 
 
     results[year][month] = 0; 
 
    } 
 
    results[year][month] += tickets; 
 

 
    return results; 
 
    }, { months: [], years: [] }); 
 

 
    return [['year', ...dataMap.months], ...dataMap.years.map(function(year) { 
 
     return [year].concat(dataMap.months.map(function(month) { 
 
     return dataMap[year][month] || 0; 
 
     })); 
 
    }) 
 
    ]; 
 
} 
 

 
console.log(mapTicketData(data));

+0

謝謝@mhodges!這正是我需要的 – Jiji

1

對此的一種可能的方法: 我將日期分組到一個對象中,創建一個具有條目的月份的唯一數組,然後將其處理到您想要的數組中。

var inArray = [['tickets', 'month','year'], [1, "june",2016],[3, "june",2015],[1, "december",2015]] 
 
var validMonths = {} 
 

 
function dateReducer (acc, curr) { 
 
    var year = curr[2] 
 
    var month = curr[1] 
 
    var num = curr[0] 
 
    if (year === "year"){return acc} 
 
    validMonths[month] = 0 // build unique array of valid months 
 
    
 
    if (!acc[year]) { 
 
    acc[year] = {} 
 
    acc[year][month] = num 
 
    } else { 
 
    if (!acc[year][month]) { 
 
     acc[year][month] = num 
 
    } else { 
 
     acc[year][month] += num 
 
    } 
 
    } 
 
    return acc 
 
} 
 

 
var obj = inArray.reduce(dateReducer, {}) 
 
// This may be fine, depending on your needs 
 
validMonths = Object.keys(validMonths) 
 
var outArray = ["year"].concat(validMonths) 
 

 
for (var year in obj) { 
 
    if (obj.hasOwnProperty(year)){ 
 
    var subArray = [year] 
 
    validMonths.forEach(v => { 
 
     subArray.push(obj[year][v] || 0) 
 
    }) 
 
    outArray.push(subArray) 
 
    } 
 
} 
 

 
console.log(outArray)

+0

不知道OP是否需要它,但是這個解決方案並沒有保留這些年份的順序。 – mhodges

+0

是真的,如果這是一個重要的因素,可以很容易地通過排序實現。 –

1

你可以用動態方式爲每月的任意數與哈希表爲參考年。

var data = [['tickets', 'month', 'year'], [1, "june", 2016], [3, "june", 2015], [1, "december", 2015]], 
 
    columns = ['year', 'june', 'december'], 
 
    temp = data.slice(1).reduce(function (result, item) { 
 
     result[item[2]] = result[item[2]] || {}; 
 
     result[item[2]][item[1]] = item[0]; 
 
     return result; 
 
    }, {}), 
 
    result = Object.keys(temp).sort(function (a, b) { return b - a; }).map(function (year) { 
 
     return columns.map(function (month, i) { 
 
      return i ? temp[year][month] || 0 : +year; 
 
     }); 
 
    }); 
 

 
result.unshift(columns); 
 

 
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

+1

爲什麼使用單字母變量名?對於那些試圖學習並將其融入到他們自己的代碼中的人來說,這可能是最糟糕的事情之一。 – mhodges

+1

就像'i'作爲count變量一樣,我選擇'a'作爲數組的項目,'r'作爲結果/返回值。 –

+0

這是懶惰,模糊,難以閱讀,而不是自我記錄。不同的字母/縮寫對不同的人意味着不同的事物。儘管它對你來說可能是有意義的,但'item'對我來說沒有意義。 – mhodges