打字稿过滤具有多个关键字字符串数组的对象数组

时间:2017-07-28 02:20:25

标签: javascript typescript filter callback

我理解如何使用一个关键字过滤对象数组中的单个属性。我目前有一个过滤服务,它使用单个关键字通过单个属性过滤掉一个对象数组,但我无法弄清楚如何在一个对象数组上使用多个关键字。这就是我到目前为止所做的:

我有一个接口餐厅,它是对象数组:

export interface Restaurant {
id: number;
name: string;
tags: string[];
}

现在我有了name属性的过滤器,我想要做的是使用带有一组首选项的tags属性数组过滤餐馆。

@Injectable()
export class PreferencesFilterService {


getFilteredRestaurants(list: Restaurant[]): Restaurant[] {
    return list.filter(function(restaurant){
        restaurant.name === "Mexican";
    });
}
}

我需要它像这个伪代码一样执行:

@Injectable()
export class PreferencesFilterService {

preferencesList: string[];


getFilteredRestaurants(list: Restaurant[]): Restaurant[] {
    return list.filter(function(restaurant){

      //loop through each restaurants "tags" attribute
      //return an array of restaurants that pass the following test:
      //  --> The restaurant's tags array strings match with at least 1 
      //      of the strings in the preferencesList array


    });
} 
}

我是javascript,Typescript和Web开发的新手,所以任何有关正确方向的帮助或指示都会非常感激。非常感谢你的时间。

编辑:
我认为我的问题不清楚,在内循环中我需要循环并检查首选项列表中的每个值,但我不想将它与" restaurant.name"进行比较。属性,我想将它与"标签中的所有值进行比较。数组属性。对不起,这是错误的沟通。

1 个答案:

答案 0 :(得分:1)

你可以这样做

@Injectable()
export class PreferencesFilterService {

    var preferencesList: string[] = ['Mexico', 'Brazil'];

    getFilteredRestaurants(list: Restaurant[]): Restaurant[] {
        return list.filter(function(restaurant) {
            for (let tag in restaurant){
                if (preferencesList.indexOf(restaurant[tag])!=-1){
                    return true;
                }
            }
            return false;
        });
    }
}

我将墨西哥和巴西列入首选项列表,您可以根据需要添加任意数量。

希望有所帮助!