我試圖總結每月的門票數量。數組我有:用javascript函數求和函數
[['tickets', 'month','year'], [1, "june",2016],[3, "june",2015],[1, "december",2015]]
結果我想:
[['year', 'june','december'], [2016,1,0],[2015,3,1]]
,但我無法弄清楚如何使用JavaScript做。 有幫助嗎? 謝謝,
我試圖總結每月的門票數量。數組我有:用javascript函數求和函數
[['tickets', 'month','year'], [1, "june",2016],[3, "june",2015],[1, "december",2015]]
結果我想:
[['year', 'june','december'], [2016,1,0],[2015,3,1]]
,但我無法弄清楚如何使用JavaScript做。 有幫助嗎? 謝謝,
實際上,你可以得到一些很酷的使用了ES6的特性在這裏(spread syntax和array 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));
謝謝@mhodges!這正是我需要的 – Jiji
對此的一種可能的方法: 我將日期分組到一個對象中,創建一個具有條目的月份的唯一數組,然後將其處理到您想要的數組中。
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)
不知道OP是否需要它,但是這個解決方案並沒有保留這些年份的順序。 – mhodges
是真的,如果這是一個重要的因素,可以很容易地通過排序實現。 –
你可以用動態方式爲每月的任意數與哈希表爲參考年。
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; }
如何'[ '年', '月', '月']'來呢?你有沒有嘗試過任何東西? –
這當然是可行的,但有更好的數據結構(即對象)來存儲這些數據。你是否鎖定在你想要的輸出中提供的數據結構中? – mhodges
@FelixKling數組中的第一個元素基本上是標題。他們與其他數組元素的數據對齊 – mhodges