typescript 按数据查找数组中的唯一值

7d7tgy0s  于 2022-12-27  发布在  TypeScript
关注(0)|答案(3)|浏览(195)

我有一个数组,其中包含从当前日期起最近七天内加入的用户的数据。例如users=['19 Dec', '21 Dec', '21 Dec']在此数组中,有三个用户在最近七天内加入。我正在尝试使用此函数查找唯一的匹配项。

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}

guykilcj

guykilcj1#

也许类似这样的东西对你有用。我使用的是this SO answer中代码的修改版本。格式的设置多亏了this 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
}

有关完整脚本,请参见the following fiddle

ulmd4ohb

ulmd4ohb2#

与上面的答案相同,但使用纯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)
ulmd4ohb

ulmd4ohb3#

我建议采用以下解决方案,用typescript编写:
1.创建一个包含过去7天的数组,并根据users-array中的日期进行格式化。
1.迭代最近7个日期(使用map-运算符),并对每一天应用filter,以找出在给定的一天有多少用户加入。

  1. getDailyRegistrations()将返回一个object,并将日期作为键,将给定日期的用户注册数作为值。
months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
          'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
users = ['19 Dec', '21 Dec', '21 Dec'];

getDailyRegistrations(numberOfDays: number = 7): any {
    let occurrences: any = {};
    this.getLastXDates(numberOfDays)
        .map(d => this.formatDate(d))
        .forEach((d: string) => {
            occurrences[d] = this.users.filter(u => u === d).length;
    });
    return occurrences;
}

/* 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}`;
}

相关问题