Javascript JS过滤对象数组的对象属性中的数组

Javascript JS过滤对象数组的对象属性中的数组,javascript,filter,Javascript,Filter,我有这样的js对象 var continents = [ 0: { short: 'na', countries: [ { name: 'canada' }, { name: 'usa' }, //... ] }, 1: { short: 'sa',

我有这样的js对象

var continents = [
0: {
       short: 'na',
       countries: [
           {
               name: 'canada'
           },
           {
               name: 'usa'
           },
           //...
       ]

   },
   1: {
       short: 'sa',
       countries: [
           {
               name: 'chile'
           },
           {
               name: 'colombia'
           }
       ]

     },
//...
]
我想用一些字符串(例如“col”)筛选此对象与国家名称(contents.countries.name)的匹配项 示例过滤器函数

filter(item => {
    return item.name.toLowerCase().indexOf('col'.toLowerCase()) >= 0;
});
预期结果:

  1: {
       short: 'sa',
       countries: [
           {
               name: 'colombia'
           }
       ]
     }

本例中的项有两个属性:国家/地区和短。您正在尝试对不存在的项运行.name。您需要对项.countries[0].name或项.countries[1].name运行.name

    var continents = [
        {
            short: 'na',
            countries: [
                {
                    name: 'canada'
                },
                {
                    name: 'usa'
                }
            ]

        },
        {
            short: 'sa',
            countries: [
                {
                    name: 'chile'
                },
                {
                    name: 'colombia'
                }
            ]

        }
    ];

    var results = continents.filter(item => {
        return item.countries[0].name.toLowerCase().indexOf('col'.toLowerCase()) >= 0 || 
item.countries[1].name.toLowerCase().indexOf('col'.toLowerCase()) >= 0
    });

    console.log(results);

工作示例:

您不仅需要过滤大陆,还需要过滤其中的国家

这是一个由两部分组成的过滤器,如下所示

var大陆=[{
简写为“na”,
国家:[
{姓名:'加拿大'},
{name:'美国'}
]
}, {
简称‘sa’,
国家:[
{名称:'智利'},
{name:'哥伦比亚'}
]
}];
函数过滤器ByKey值(arr、键、val){
返回arr.filter(项目=>{
返回项[keys[0]].some(subitem=>subitem[keys[1]].indexOf(val)>-1);
}).map(项目=>{
item[keys[0]]=item[keys[0]]。筛选器(子项=>子项[keys[1]]。indexOf(val)>-1);
退货项目;
});
}
var filtered=FilterByValue(大陆、[‘国家’、‘名称’]、‘列’);
console.log(过滤)
.as控制台包装{top:0;最大高度:100%!重要;}

您可以使用
过滤器
功能仅返回符合条件的项目。像这样:

const matches = [];
continents.forEach((continent) => {

  const countries = continent.countries.filter((country) => {
    return country.name.includes('col');
  });

  matches.push(...countries);
});

注意:我使用了操作符
来修饰数组(避免数组数组)

对于循环,您可以使用:

var continents = [
    {
        short: 'na',
        countries: [
            {
                name: 'canada'
            },
            {
                name: 'usa'
            }
        ]
    },
    {
        short: 'sa',
        countries: [
            {
                name: 'chile'
            },
            {
                name: 'colombia'
            }
        ]
    }
];

var results = continents.filter(item => {
    for (let x = 0; x < item.countries.length; x++) {
        if (item.countries[x].name.toLowerCase().indexOf('usa') > -1) {
            return item;
            break;
        }
    }
});

console.log(results);
var大陆=[
{
简写为“na”,
国家:[
{
姓名:“加拿大”
},
{
名称:“美国”
}
]
},
{
简称‘sa’,
国家:[
{
名称:“智利”
},
{
姓名:“哥伦比亚”
}
]
}
];
var结果=大陆。过滤器(项目=>{
对于(设x=0;x-1){
退货项目;
打破
}
}
});
控制台日志(结果);

工作示例:

您可以尝试筛选国家,如果找到,则将外部大陆也推到结果集

函数getItems(名称){
var结果=[];
大陆。forEach(功能(大陆){
var countries=洲.国家.过滤器(函数(国家){
返回country.name.startsWith(name);
});
if(国家/地区长度){
结果.推送({short:continent.short,countries:countries});
}
});
返回结果;
}
var大陆=[{name:'na',国家:[{name:'canada'},{name:'usa'}]},{short:'sa',国家:[{name:'chile'},{name:'columbia'}]}];
log(getItems('col')

。作为控制台包装{最大高度:100%!重要;顶部:0;}
是。我有6个大洲和250多个国家。我寻找解决方案,如何循环通过它们并进行过滤