我有以下对象。
"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()
})
})
但是它们都返回未定义的数组。
答案 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
对象的每个数组属性(bar
和events
)的结果,以仅包括其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)
)
这里的要点是,我们已将您的问题分解成小块。 mapObject
和filter
其中两个非常可重用,而其他两个非常简单。