在JS中过滤对象内部的对象数组

时间:2019-06-11 16:46:26

标签: javascript

我有以下对象。

"events": {
  "foo": [
    {
      "end": "1/2/2019"
    },
    {
      "end": "2/12/2019"
    }
  ],
  "bar": [
    {
      "end": "1/2/2019"
    },
    {
      "end": "2/12/2019"
    }
  ]
}

我想根据结束日期过滤事件并创建如下所示的内容:

"events": {
  "foo": [
    {
      "end": "2/12/2019"
    }
  ],
  "bar": [
    {
      "end": "2/12/2019"
    }
  ]
}

OR

"events": [
  {
    "end": "2/12/2019"
  },
  {
    "end": "2/12/2019"
  }
]

我想知道如何使用ES2015方法做到这一点。

我尝试了以下操作:

return Object.values(this.events).map(a=>{
 a.filter(b=>{
   new Date(b.end) > new Date()
 })
})

但是它们都返回未定义的数组。

3 个答案:

答案 0 :(得分:0)

您在上面的代码中缺少return语句。您的代码应如下所示-

return Object.values(this.events).map(a => {
    return a.filter(b => {
        return new Date(b.end) > new Date()
    })
})

答案 1 :(得分:0)

let test = {"events": {
  "foo": [
    {
      "end": "1/2/2019"
    },
    {
      "end": "2/12/2019"
    }
  ],
  "bar": [
    {
      "end": "1/2/2019"
    },
    {
      "end": "2/12/2019"
    }
  ]
}}

let currentDate = new Date("1/3/2019");
Object.keys(test.events).forEach(a => {
 test.events[a] = test.events[a].filter(b => new Date(b.end) > currentDate);
})

console.log(test)

答案 2 :(得分:0)

我认为将这样的问题分解成各个组成部分很有用。您希望过滤foo对象的每个数组属性(barevents)的结果,以仅包括其end属性符合某些条件的结果。 (您未指定,所以我假设条件可能是``2019年1/31 /之后''。)

好吧,我们可以轻松地编写一个函数来判断end属性是否在给定日期之后。我们知道如何过滤数组,尽管在这里我包括了一个方便的函数来简化数组。因此,我们需要一种在对象上映射函数的方法,即Array.prototype.map在数组上映射的方法。在这里,我编写了一个简单的mapObject

将它们组合成filterByDateAfter给我们提供了一个我们可以这样调用的函数:

filterByDateAfter ('1/31/2019') (events)

获得想要的结果。

const mapObject = (fn) => (obj) => 
  Object .entries (obj)
    .reduce ((a, [k, v]) => ({...a, [k]: fn(v)}), {})

const filter = (pred) => (arr) => 
  arr .filter (pred)

const endAfter = (str, d = new Date (str)) => (obj) =>
  new Date (obj .end) > d

const filterByDateAfter = (dateStr) => mapObject (filter (endAfter (dateStr) ) )

const events = {"bar": [{"end": "1/2/2019"}, {"end": "2/12/2019"}], "foo": [{"end": "1/2/2019"}, {"end": "2/12/2019"}]}

console .log (
  filterByDateAfter ('1/31/2019') (events)
)

这里的要点是,我们已将您的问题分解成小块。 mapObjectfilter其中两个非常可重用,而其他两个非常简单。