[英]Find Unique Values in Array datawise
我有一个数组,其中包含从当前日期起最近 7 天内加入的用户的数据。 例如users=['19 Dec', '21 Dec', '21 Dec']
在此数组中,三个用户在过去 7 天内加入。 我试图找到这个函数的独特之处。 `
let occurences = users.reduce(function (acc, curr) {
return acc[curr] ? ++acc[curr] : (acc[curr] = 1), acc;
}, {});
`
它返回包含以下键对的对象: {19 Dec: 1, 21 Dec: 2}
我希望用 0 及其各自的日期填充对象中缺失的值。 因此,最终的 O/P 将是: {19 Dec: 1, 20 Dec: 0, 21 Dec: 2, 22 Dec: 0, 23 Dec: 0, 24 Dec: 0, 25 Dec: 0}
有人可以帮我解决这个问题吗?
我期望用 0 和它各自的日期来填充对象中缺失的值。 因此,最终的 O/P 将是: {19 Dec: 1, 20 Dec: 0, 21 Dec: 2, 22 Dec: 0, 23 Dec: 0, 24 Dec: 0, 25 Dec: 0}
也许这样的事情对你有用。 我正在使用此 SO answer中找到的代码的修改版本。 由于这个 SO answer ,格式化完成了。
首先,让我们构建一个包含最近 7 天的数组。
Date.prototype.addDays = function(days) {
var date = new Date(this.valueOf());
date.setDate(date.getDate() + days);
return date;
}
function getDates(startDate, stopDate) {
var dateArray = [];
var currentDate = startDate;
while (currentDate <= stopDate) {
var calendarDay = currentDate.getDate();
var monthName = new Intl.DateTimeFormat('en-US', options).format(currentDate);
dateArray.push(calendarDay + " " + monthName);
currentDate = currentDate.addDays(1);
}
return dateArray;
}
var options = { month: 'short' };
var end = new Date();
var start = end.addDays(-7);
var dateArray = getDates(start,end);
接下来,我们假设这是带有日期的 JSON 对象 - 短月份名称作为键,非零用户数作为值。
let occurences = {
"19 Dec": 1,
"21 Dec": 2
};
我们将制作它的工作副本,然后根据需要对其进行修改。 您不必这样做 - 您可以以不同的方式声明occurences
,然后修改它,但我正在用副本来做。
var copyOcc = occurences;
接下来,我们将遍历我们的dateArray
,并检查是否有与occurences
中的当前值相对应的键dateArray
。
for(var i = 0; i < dateArray.length; i++) {
// If the key isn't there, add it
if(!copyOcc.hasOwnProperty(dateArray[i])) {
copyOcc[dateArray[i]] = 0;
}
}
console.log(copyOcc);
这将输出:
{
18 Dec: 0,
19 Dec: 1,
20 Dec: 0,
21 Dec: 2,
22 Dec: 0,
23 Dec: 0,
24 Dec: 0,
25 Dec: 0
}
有关完整脚本,请参阅以下小提琴。
我建议使用typescript编写的以下解决方案:
users
数组中的日期进行格式化。map
-operator)并为每一天应用filter
以找出在给定日期有多少用户加入。getDailyRegistrations()
将返回您要查找的结果。months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
users = ['19 Dec', '21 Dec', '21 Dec'];
getDailyRegistrations(numberOfDays: number = 7): string[] {
return this.getLastXDates(numberOfDays)
.map(d => this.formatDate(d))
.map(d => `${d}: ${this.users.filter(u => u === d).length}`);
}
/* Helper methods */
private getLastXDates(numbOfDays: number): Date[] {
return Array.from(Array(numbOfDays).keys()).reverse().map(i => {
const d = new Date();
d.setDate(d.getDate() - i);
return d;
});
}
private formatDate(d: Date): string {
const day = d.getDate();
const month = this.months[d.getMonth()];
return `${day} ${month}`;
}
与上面的答案相同,但在纯 javascript 中。
const users = ['19 Dec', '21 Dec', '21 Dec']
const month_to_abv = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
// fetch previouse days, default it fetches 7 days
function getPreviouseDaysObj(noOfDays = 7) {
const obj = {};
for (let i = 0; i < noOfDays; i++) {
const curr_date = new Date();
curr_date.setDate(curr_date.getDate() - i);
obj[formatDate(curr_date)] = 0;
}
return obj;
}
// format date
function formatDate(date) {
return `${date.getDate()} ${month_to_abv[date.getMonth()]}`
}
// create obj for previouse 7 days
const previouse_days = getPreviouseDaysObj(7);
// calculate occurance
const occurences = users.reduce(function (acc, curr) {
acc[curr] ? ++acc[curr] : (acc[curr] = 1);
return acc;
}, Object.assign({}, previouse_days));
// Log to console
console.log(occurences)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.