如何从对象数组获取唯一的日期值

时间:2019-12-27 00:04:31

标签: javascript arrays object isodate

我需要以DD.MM.格式获取多个日期值的所有唯一的 days 。在此示例数据中,12月24日有两个值:

const data = [
    { date: ISODate("2019-12-24T03:24:00Z") },
    { date: ISODate("2019-12-24T04:56:00Z") },
    { date: ISODate("2019-12-25T02:34:00Z") },
    { date: ISODate("2019-12-26T01:23:00Z") }
]

所以结果应该是

const result = [
    '24.12.',
    '25.12.',
    '26.12.'
]

首先,我将映射数据并仅将日期的值分开:

const dates = data.map(d => d.date.toString().split('T')[0])

但是如何获取唯一值并更改输出格式?


更新

我想到了这个,但是看起来很复杂...

data.map(d => {
  const dateSplit = d.date.toString().split('T')[0].split('-')
  return dateSplit[2] + '.' + dateSplit[1] + '.'
})
.filter((value, index, self) {
  return self.indexOf(value) === index
})

5 个答案:

答案 0 :(得分:2)

似乎ISODate返回了一个标准的JS Date对象。您可以使用Date.getDate()来获取日期,并使用Date.getMonth()来获取月份(基于0,因此我们需要添加1):

const data = [
  { date: new Date('2019-12-24T03:24:00Z') },
  { date: new Date('2019-12-24T04:56:00Z') },
  { date: new Date('2019-12-25T02:34:00Z') },
  { date: new Date('2019-12-26T01:23:00Z') }
]

const result = [...new Set(data.map(({ date: d }) => 
  `${d.getDate()}.${d.getMonth() + 1}.`
))]

console.log(result)

上一个答案:

使用正则表达式匹配月份和日期,并使用解构将它们分配给const。使用模板文字组装字符串。通过将值分配给Set来删除重复项,然后传播回数组。

注意:由于我无权访问ISODate,因此已将其删除。我离开了.toString(),尽管在此示例中不需要使用const data = [ { date: '2019-12-24T03:24:00Z' }, { date: '2019-12-24T04:56:00Z' }, { date: '2019-12-25T02:34:00Z' }, { date: '2019-12-26T01:23:00Z' } ] const pattern = /-([0-9]{2})-([0-9]{2})T/ const result = [...new Set(data.map(d => { const [, mon, day] = d.date.toString().match(pattern) return `${day}.${mon}.`; }))] console.log(result),但在与ISODate一起使用时会需要它。

struct reg registers = { '1', '2', '3'};  // "registers" isn't a pointer
printf("The number before function: %d\n", registers.pc); // "." instance of a struct
cpu(&registers, data, cmd);// pass the address of "registers"

答案 1 :(得分:0)

使用.filter()仅过滤其值的第一个值。

//temporary function
const ISODate = (d) => d;

const data = [{
    date: ISODate("2019-12-24T03:24:00Z")
  },
  {
    date: ISODate("2019-12-24T04:56:00Z")
  },
  {
    date: ISODate("2019-12-25T02:34:00Z")
  },
  {
    date: ISODate("2019-12-26T01:23:00Z")
  }
]

const dates = data.map(d => d.date.toString().split('T')[0].split("-").slice(1, 3).reverse().join(".") + ".")

console.log(dates.filter((v, i, a) => a.indexOf(v) === i));

答案 2 :(得分:0)

您可以使用Array.reduce轻松完成此操作。请注意,由于我没有该类,因此将ISODate转换为Date,但是它应该是相同的概念。

const data = [
    { date: new Date("2019-12-24T03:24:00Z") },
    { date: new Date("2019-12-24T04:56:00Z") },
    { date: new Date("2019-12-25T02:34:00Z") },
    { date: new Date("2019-12-26T01:23:00Z") }
];
const result = data.reduce( (acc, curr) => {
  if (acc.length > 0) {
    const hasDate = acc.find(d => d.date.getMonth() === curr.date.getMonth() && d.date.getDate() === curr.date.getDate());
    if (!hasDate) { acc.push(curr); }
  } else {
    acc.push(curr);
  }
  return acc;
}, []);

console.log(result);

答案 3 :(得分:-1)

我将使用Underscore.js库中的uniq函数:

const data = [
    { date: ISODate("2019-12-24T03:24:00Z") },
    { date: ISODate("2019-12-24T04:56:00Z") },
    { date: ISODate("2019-12-25T02:34:00Z") },
    { date: ISODate("2019-12-26T01:23:00Z") }
];

let dates = _.uniq(data.map(d => d.date.toString().split('T')[0]));

答案 4 :(得分:-1)

一种相当不错的方式是:

const array = [1, 2, 6, 5,5, 5, 3, 7, 8];

const uniqueKeys = array.reduce((hashMap, value) => {
  if (!hashMap[value]) {
    hashMap[value] = true;
  }
  return hashMap;
}, {});

const uniqueValues = Object.keys(uniqueKeys);

console.log(uniqueValues);

这很好,因为它只对数组进行一次迭代,而不是像.filter()示例那样对x * x(也就是log(n)而不是log(n ^ 2))进行迭代

const array = [1, 2, 6, 5,5, 5, 3, 7, 8];

const uniqueKeys = array.reduce((hashMap, value) => {
  if (!hashMap[value]) {
    hashMap[value] = true;
  }
  return hashMap;
}, {});

const uniqueValues = Object.keys(uniqueKeys);

console.log(uniqueValues);