Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/418.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用函数方法从一系列数组中提取数据_Javascript_Arrays_Filter_Reduce - Fatal编程技术网

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变量

然后