Javascript 使用函数方法从一系列数组中提取数据
我需要对我得到的数据做一些额外的过滤,这样我只得到符合某些标准的数据。我正试图找到一个操作符的组合,我可以通过函数式编程方法来实现这一点。我在想,Javascript 使用函数方法从一系列数组中提取数据,javascript,arrays,filter,reduce,Javascript,Arrays,Filter,Reduce,我需要对我得到的数据做一些额外的过滤,这样我只得到符合某些标准的数据。我正试图找到一个操作符的组合,我可以通过函数式编程方法来实现这一点。我在想,filter和reduce的组合可能会有用吗?我可以简单地将它们的组合链接在一起,以获得我想要的结果吗 我的数据结构如下所示: "data": [ { "_id": "53545", "services": [ { "service": "service1"
filter
和reduce
的组合可能会有用吗?我可以简单地将它们的组合链接在一起,以获得我想要的结果吗
我的数据结构如下所示:
"data": [
{
"_id": "53545",
"services": [
{
"service": "service1",
"history": [
{
"_id": "6546",
"status": "stage1",
"completed": true
},
{
**"_id": "6547",
"status": "stage2",
"completed": false**
}
],
{
"service": "service2",
"history": [
{
"_id": "6743",
"status": "stage3",
"completed": false
},
{
"_id": "3742",
"status": "stage2",
"completed": true
}
]
},
{
"service": "service3",
"history": [
{
"_id": "6448",
"status": "stage4",
"completed": false
},
{
"_id": "4443",
"status": "stage1",
"completed": true
}
]
}
]
需要说明的是,这里的数据
、服务
和历史
都是数组。在上述数据的情况下,“历史”中只有一个对象应该通过测试,因为只有一个对象的“状态:stage2”和“完成:false”。但这意味着,在“data”数组中,这个特定的对象,即带有“_id”:“53545”的对象应该通过测试,因为测试结果为true。最后,我想从“数据”数组中的对象中返回一个数组,该数组与此匹配
非常具体地说,在我的例子中,总是有3种服务。在这3个对象中,可能有1个或多达30个或更多历史对象。我需要查看所有3个“服务”,并找到状态为“stage2”和“completed:false”的历史对象。因此,如果这三个服务中的任何一个具有“status:stage2”和“completed:false”的历史对象,则应该返回true
我在数组中迭代数组时被绊倒了
我可以通过以下方式直接获得:
let stage2Data = data.filter(data => data.services[0].history[1].status === 'stage2' && data.services[0].history[1].completed === false);
但是,我显然不知道这些不同数组中的哪个项目编号将包含我要查找的值。那么,解决这个问题的最佳方法是什么?我想一系列for-of循环也可以工作,但我想使用一种更实用的方法,并且考虑将“filter”和“reduce”结合起来,或者“map”也可以在这里工作。如何仅返回“数据”数组中的对象,其中“
”状态“:“stage2”
和“completed”:对于“history”数组中的至少一个对象,false
为true?筛选操作将基于与您的值匹配的谓词
如果您想要服务对象列表,请尝试以下方法:
let result=data[0]。services.filter((item)=>item.history.some((h)=>h.status=='stage2'&&h.completed==false));
筛选操作将基于与您的值匹配的谓词
如果您想要服务对象列表,请尝试以下方法:
let result=data[0].services.filter((item)=>item.history.some((h)=>h.status=='stage2'&&h.completed==false));
这取决于您想要结果数据的方式,这是您的一个开始。您可以使用一些嵌套的筛选器强制执行此操作:
result = data.filter((datum) => {
return datum.services.filter((service) => {
return service.history.filter((h) => {
return h.completed && h.status === "stage2"
}).length > 0;
}).length > 0;
});
tl;dr-根据包含至少有一条在阶段2中完成的历史记录的服务的任何数据筛选主列表
工作小提琴:
如果希望生成的数组只包含通过筛选的历史记录,则必须修改代码。此外,这是一个关于^3的问题,因此,如果此数据可能非常庞大,则可能需要修改方法。但这应该可以让您继续
不要担心功能是否强大。如果你能找到一个人们能够理解和维护的工作解决方案,那就是一个好的开始。根据你想要结果数据的方式,这里是一个开始。你可以使用一些嵌套的过滤器来强制实现这一点:
result = data.filter((datum) => {
return datum.services.filter((service) => {
return service.history.filter((h) => {
return h.completed && h.status === "stage2"
}).length > 0;
}).length > 0;
});
tl;dr-根据包含至少有一条在阶段2中完成的历史记录的服务的任何数据筛选主列表
工作小提琴:
如果希望生成的数组只包含通过筛选的历史记录,则必须修改代码。此外,这是一个关于^3的问题,因此,如果此数据可能非常庞大,则可能需要修改方法。但这应该可以让您继续
不要担心功能是否强大。如果你能找到一个人们能够理解和维护的工作解决方案,那就是一个好的开始。我们在评论中反复讨论,试图在你的问题中找到一个有效的数据结构。让我给你一个简单的例子,说明如何让每个人都能更轻松地完成这项工作 首先,使用编辑器框顶部的snippet按钮创建一个snippet。该图标看起来像一个典型的“折叠角”文档图标,里面有
这将打开一个弹出框,其中包含HTML/CSS/JavaScript代码的位置。忽略HTML和CSS框,并将数据对象粘贴到JavaScript框中
因为它不是“原样”的JavaScript,所以将其包装在赋值语句中,以获得可以使用的JavaScript变量
然后在末尾添加console.log
语句以显示数据。使用Run按钮确保代码实际解析和运行并正确显示数据。一旦这样做,人们将更容易帮助您
以下是一个简化的示例:
const输入={
“数据”:[
{
“一”:“二”
},
{
“三”:“四”
}
]
};
console.log(JSON.stringify(input,null,4));
我们在评论中反复讨论,试图在您的问题中获得一个有效的数据结构。让我给您一个简单的示例,说明如何让每个人都能更容易地理解这个问题
首先,使用编辑器框顶部的snippet按钮创建一个snippet。该图标看起来像一个典型的“折叠角”文档图标,里面有
这将打开一个弹出框,其中包含HTML/CSS/JavaScript代码的位置。忽略HTML和CSS框,并将数据对象粘贴到JavaScript框中
因为它不是“原样”的JavaScript,所以将其包装在赋值语句中,以获得可以使用的JavaScript变量
然后