【问题标题】:how to filter the key value object based on value substring如何根据值子字符串过滤键值对象
【发布时间】:2018-12-26 03:05:57
【问题描述】:

下面是我拥有的对象数组。这具有每个日期多次的对象。

"list": [
        {
            "dt": 1545760800,
            "dt_txt": "2018-12-25 18:00:00"
        },
        {
            "dt": 1545771600,
            "dt_txt": "2018-12-25 21:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 00:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 03:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 04:00:00"
        }
       ]

如何过滤此对象数组以获取每个数据仅一个对象。 dt_txt

"list": [
        {
            "dt": 1545760800,
            "dt_txt": "2018-12-25 18:00:00"
        },
        {
            "dt": 1545782400,
            "dt_txt": "2018-12-26 00:00:00"
        }
       ]

如何获得?

【问题讨论】:

  • 哪个 dt_txt 将用于相同的 dt?
  • 不会有相同的dt。它是独一无二的。它是 dt_txt 的 UNIX 时间戳。
  • 您的示例数据清楚地显示了具有相同dt 值的多条记录。请edit您的问题包括实际的输入、输出以及您如何从输入到输出的规则。最好包括您自己解决问题的尝试。

标签: javascript ecmascript-6 filtering


【解决方案1】:

您的问题要求为每个 data.dt_txt 提供一个项目,但您想要的结果看起来您只想要 data.dt_txt 的第一部分。应该清楚的是,这两种方式都可以 - 如果你想要整个事情,就不要拆分值。

您可以只保留一个set 的可见值并根据它进行过滤。如果您找到一个新值,请将其添加到集合中:

let list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]

let seen = new Set()
let filtered = list.filter(item => {
    let [date, _] = item.dt_txt.split(' ')
    return seen.has(date) ?  false : seen.add(date)
})

console.log(filtered)

【讨论】:

    【解决方案2】:

    您可以通过不同方式使用reduce:

    1] 在accumulator 数组中检查是否存在与dt_txt 相同日期的对象。如果是,则跳过该项目,否则将该项目添加到accumulator

    const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]
    
    const filter1 = list.reduce((acc, i) => (
      acc.find(a => new Date(a.dt_txt).toDateString() === new Date(i.dt_txt).toDateString())
      ? '' 
      : acc.push(i), acc), 
    []);
    
    console.log(filter1);

    2] 在第二种方法中,创建了一个单独的函数 compareDates 来比较日期并返回 boolean。我正在使用toDateString() 来比较日期

    const list = [{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}]
    
    // create a seperate function to compare the dates a return a boolean
    const compareDates = (d1, d2) => new Date(d1).toDateString() === new Date(d2).toDateString();
    
    const filter2 = list.reduce((acc, i) => (
      acc.find(a => compareDates(a.dt_txt, i.dt_txt)) ? '' : acc.push(i), acc)
    ,[])
    
    console.log(filter2);

    3] 在第三种方法中,目标是创建一个以唯一日期值作为键的对象。对于原始数组中的每个项目,检查该日期是否已作为 accumulator 中的键存在。如果是,则在上下文中跳过当前项目,否则将当前项目添加为它的值。最后,您在原始数组中有一个不同对象的键值对。因此,只需使用 Object.values 获取值

    const list =[{"dt": 1545760800,"dt_txt": "2018-12-25 18:00:00"},{"dt": 1545771600,"dt_txt": "2018-12-25 21:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 00:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 03:00:00"},{"dt": 1545782400,"dt_txt": "2018-12-26 04:00:00"}];
    
    // gets only the date part in string 
    const getDateString = (date) => new Date(date).toDateString();
    
    const filter3 = Object.values(
          list.reduce((acc, i) => 
            (acc[getDateString(i.dt_txt)] = acc[getDateString(i.dt_txt)] || i, acc),{}))
            
    console.log(filter3);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-05-16
      • 2020-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-06
      相关资源
      最近更新 更多