Javascript如何在json数组上使用array.filter在属性与列表匹配时返回整个数组

Javascript如何在json数组上使用array.filter在属性与列表匹配时返回整个数组,javascript,json,Javascript,Json,我需要关于如何筛选数组的帮助 在用户\u数组中,我有一些数组,我必须在这些数组中比较标题\u info.sap\u number是否与有效的\u sap\u number数组中的任何内容匹配 如果该属性值与有效的\u sap\u数字数组中的任何内容匹配 它将保留该数组及其父数组,然后删除所有与有效的\u sap\u number数组中的任何值不匹配的其他数组,我不知道如何正确解释它,请参见我的示例,谢谢 我有这样的数组 var valid_sap_number = ['1','2'] var u

我需要关于如何筛选数组的帮助

在用户\u数组中,我有一些数组,我必须在这些数组中比较
标题\u info.sap\u number
是否与
有效的\u sap\u number数组
中的任何内容匹配

如果该属性值与
有效的\u sap\u数字数组中的任何内容匹配

它将保留该数组及其父数组,然后删除所有与
有效的\u sap\u number数组中的任何值不匹配的其他数组,我不知道如何正确解释它,请参见我的示例,谢谢

我有这样的数组

var valid_sap_number = ['1','2']
var user_array = 
[{
  "name":"User1",
  "header_info": [{ "sap_number":"1" }],
  "footer_info": [{ "site":"ABC" }]
}],
[{
  "name":"User2",
  "header_info": [{ "sap_number":"2" }],
  "footer_info": [{ "site":"ABCD" }]
}],
[{
  "name":"User3",
  "header_info": [{ "sap_number":"3" }],
  "footer_info": [{ "site":"ABC" }]
}];

/* This is my spaghetti code */

 const result = user_array.filter(user => function(a,b){        
            for(i = 0; i < valid_sap_number.length; i++)
            {
                if(b.header_info[0].sap_number == valid_sap_number[i]){
                    return true;     
                }
            }
        });

    console.log(result); 

您可以在filter函数中使用array
includes
函数来检查当前项是否与值列表中的任何项匹配

const result = user_array.filter(user => { 
  return valid_sap_number.includes(user[0].header_info[0].sap_number);
  });

首先,您的
user\u数组
看起来不是有效的数组(没有完整的包装器)

在这种情况下,您可以使用
.filter()

见下文:

var valid\u sap\u number=['1','2']
变量用户_数组=[
[{
“名称”:“User1”,
“标题信息”:[{“sap编号”:“1”}],
“页脚信息”:[{“站点”:“ABC”}]
}],
[{
“名称”:“用户2”,
“标题信息”:[{“sap编号”:“2”}],
“页脚信息”:[{“站点”:“ABCD”}]
}],
[{
“名称”:“User3”,
“标题信息”:[{“sap编号”:“3”}],
“页脚信息”:[{“站点”:“ABC”}]
}]
];

const result=user\u array.filter(a=>有效的\u sap\u编号。包括(a[0]。header\u info[0]。sap\u编号))
根据您的评论,我认为您可以临时修改JSON结构。目前的结构有些误导,不符合您的要求

提案

user_array = [
   {
         "name" : "User1",
         "header_info": {
            "sap_number": 1,
            //... other properties of header_info
         },
         "footer_info" : {
             "site" : "ABC",
             //... other properties of footer_info
         }
   },


{
         "name" : "User2",
         "header_info": {
            "sap_number": 2,
            //... other properties of header_info
         },
         "footer_info" : {
             "site" : "ABCE",
             //... other properties of footer_info
         }
   }

] 
然后做一个像这样的过滤器

user_array.filter( user => valid_sap_number.includes(user.header_info.sap_number));

你能给我解释一下这段代码吗?有效的\u sap\u编号。包括(一个[0]。标题信息[0]。sap\u编号))为什么设置为[0]?它是如何通过设置[0]来检查3个数组键的,它工作了,但我没有得到它,谢谢,!基本上,
include()。这里的
a
是您的
user\u数组
单项目表示形式(很抱歉,我没有使用有意义的名称),现在根据您的结构,
a
是数组中的另一个数组,我们希望它只有一个项目,所以我指定只获取
[0]
。与
header\u info
相同,因为您也将其设置为数组,所以我只需要获取第一个索引,即
[0]
谢谢您bryan,我忘了我将其设置为数组,再次感谢您,当子数组类似于
[{“sap\u number”:1},{“sap\u number”:3}]
@DRB每个header\u info只有一个sap\u编号时会发生什么情况,但是它可能有其他属性,我不知道这种数组结构是否合适,我有大约100个属性,这就是为什么我这样分组它。非常感谢。谢谢,它成功了,你能解释一下它是如何返回整个数组的吗?只需检查有效的\u sap\u编号是否包括(用户[0]。标题\u信息[0]。sap\u编号)我以为它只会返回一个有效的\u sap\u编号,谢谢,我可以调整属性并删除数组,但我想我将很难让我的用户使用这种格式,因为我将不得不调整我添加的每个对象和数组映射,以及我对数据所做的许多处理,谢谢你的建议,我希望我可以要求你更多地简化我代码的其他部分,谢谢,
user_array = [
   {
         "name" : "User1",
         "header_info": {
            "sap_number": 1,
            //... other properties of header_info
         },
         "footer_info" : {
             "site" : "ABC",
             //... other properties of footer_info
         }
   },


{
         "name" : "User2",
         "header_info": {
            "sap_number": 2,
            //... other properties of header_info
         },
         "footer_info" : {
             "site" : "ABCE",
             //... other properties of footer_info
         }
   }

] 
user_array.filter( user => valid_sap_number.includes(user.header_info.sap_number));