提问者:小点点

Javascript中数组的嵌套过滤


我有两个数组:

国家代码:

  [
      {
        "countryCode": "DEU",
        "name": "Germany",
        "companyFunctions": [
          {
            "name": "E-Commerce",
            "companyName": "Company 1"
          }
        ]
      },
      {
        "countryCode": "FRA",
        "name": "France",
        "companyFunctions": [
          {
            "name": "Shopping Centre",
            "companyName": "Company 1"
          },
          {
            "name": "Support Services",
            "companyName": "Company 2"
          },
          {
            "name": "Procurement Support",
            "companyName": "Company 3"
          },
          {
            "name": "Retail",
            "companyName": "Company 3"
          }
        ]
      }
    ]

filterarr:

[
    {
        "name": "Company 2", 
        "id": "32434d324-32434"
    },
    {
        "name": "Company 3", 
        "id": "2643d3254-39244"
    }
]

我要做的是通过循环遍历Countriesarr数组来筛选Countriesarr,其中Countriesarr.companyFunctions.companyName===filterarr.name

我编写了如下代码:

countriesArr.filter(p =>
    p.companyFunctions.filter(cF =>
        filterArr.filter(c => c.name === cF.companyName)
    )
); 

但这似乎不起作用,因为它还返回来自countriesarr的德国对象,并且它在来自countriesarr的法语对象的companyfunctions中包含company1,而company1不在filterarr中。

我做错了什么?

所需的结果应如下所示:

[
  {
    "countryCode": "FRA",
    "name": "France",
    "companyFunctions": [
      {
        "name": "Support Services",
        "companyName": "Company 2"
      },
      {
        "name": "Procurement Support",
        "companyName": "Company 3"
      },
      {
        "name": "Retail",
        "companyName": "Company 3"
      }
    ]
  }
]

共3个答案

匿名用户

null

const countriesArr = [
    {
        countryCode: 'DEU',
        name: 'Germany',
        companyFunctions: [
            {
                name: 'E-Commerce',
                companyName: 'Company 1',
            },
        ],
    },
    {
        countryCode: 'FRA',
        name: 'France',
        companyFunctions: [
            {
                name: 'Shopping Centre',
                companyName: 'Company 1',
            },
            {
                name: 'Support Services',
                companyName: 'Company 2',
            },
            {
                name: 'Procurement Support',
                companyName: 'Company 3',
            },
            {
                name: 'Retail',
                companyName: 'Company 3',
            },
        ],
    },
];

const filterArr = [
    {
        name: 'Company 2',
        id: '32434d324-32434',
    },
    {
        name: 'Company 3',
        id: '2643d3254-39244',
    },
].map((f) => f.name);

const result = countriesArr
    .map((c) => ({
        ...c,
        companyFunctions: c.companyFunctions.filter((cf) => filterArr.includes(cf.companyName)),
    }))
    .filter((c) => c.companyFunctions.length > 0);

console.log(result);

匿名用户

如果CompanyFunctions包含所需的名称,则可以重新生成新对象。

null

const
    countriesArr = [{ countryCode: "DEU", name: "Germany", companyFunctions: [{ name: "E-Commerce", companyName: "Company 1" }] }, { countryCode: "FRA", name: "France", companyFunctions: [{ name: "Shopping Centre", companyName: "Company 1" }, { name: "Support Services", companyName: "Company 2" }, { name: "Procurement Support", companyName: "Company 3" }, { name: "Retail", companyName: "Company 3" }] }],
    filterArr = [{ name: "Company 2", id: "32434d324-32434" }, { name: "Company 3", id: "2643d3254-39244" }],
    names = filterArr.reduce((r, { name }) => (r[name] = true, r), {}),
    result = countriesArr.reduce((r, { companyFunctions, ...o }) => {
        companyFunctions = companyFunctions.filter(({ companyName }) => names[companyName]);
        if (companyFunctions.length) r.push({ ...o, companyFunctions });
        return r;
    }, []);

console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

匿名用户

您需要的不是countriesarr上的筛选器,而是map()(用于转换它),然后是filter()(用于删除具有0个companyFunctions的条目),反之亦然(首先是filter()那些至少有一个匹配的CompanyFunction,然后是map用于转换,删除不需要的条目)。 但映射然后过滤对我来说更简单。。。

const result = countriesArr                                                 
    .map(function(ca) {                                                     
        ca.companyFunctions = ca.companyFunctions.filter(                   
                cf => filterArr.some(fa=>fa.name==cf.companyName)           
        );                                                                  
        return ca;                                                          
    })                                                                      
    .filter(ca=>ca.companyFunctions.length)                                 
;                                                                           
                                                                            
console.log(JSON.stringify(result, null, 4));                               
// [                                                                        
//     {                                                                    
//         "countryCode": "FRA",                                            
//         "name": "France",                                                
//         "companyFunctions": [                                            
//             {                                                            
//                 "name": "Support Services",                              
//                 "companyName": "Company 2"                               
//             },                                                           
//             {                                                            
//                 "name": "Procurement Support",                           
//                 "companyName": "Company 3"                               
//             },                                                           
//             {                                                            
//                 "name": "Retail",                                        
//                 "companyName": "Company 3"                               
//             }                                                            
//         ]                                                                
//     }                                                                    
// ]