如何使用过滤器搜索数组中对象的多个键值?

Jam*_*now 2 javascript arrays filtering vue.js vuejs2

我有一系列含有各种葡萄酒数据的葡萄酒:

var wines = [
  { _id: '59a740b8aa06e549918b1fda',
    wineryName: 'Some Winery',
    wineName: 'Pinot Noir',
    wineColor: 'Red',
    imageLink: '/img/FortBerensPN.png' },
  { _id: '59a7410aaa06e549918b1fdb',
    wineryName: 'Some Winery',
    wineName: 'Pinot Gris',
    wineColor: 'White',
    imageLink: '/img/FortBerensPG.png' },
  { _id: '59a74125aa06e549918b1fdc',
    wineryName: 'Some Winery',
    wineName: 'Rose',
    wineColor: 'Rose',
    imageLink: '/img/FortBerensRose.png' },
  { _id: '59a74159aa06e549918b1fdd',
    wineryName: 'Some other Winery',
    wineName: 'Rose',
    wineColor: 'Rose',
    imageLink: '/img/FortBerensRose.png' },
  { _id: '59a7417aaa06e549918b1fde',
    wineryName: 'Some other Winery',
    wineName: 'Pinot Gris',
    wineColor: 'White',
    imageLink: '/img/FortBerensPG.png' },
  { _id: '59a8721f4fd43b676a1f5f0d',
    wineryName: 'Some other Winery',
    wineName: 'Pinot Gris',
    wineColor: 'White',
    imageLink: '/img/FortBerensPG.png' },
  { _id: '59a872244fd43b676a1f5f0e',
    wineryName: 'Winery 3',
    wineName: 'Pinot Noir',
    wineColor: 'Red',
    imageLink: '/img/FortBerensPN.png' } ]
Run Code Online (Sandbox Code Playgroud)

我可以弄清楚如何搜索 - 不区分大小写 - 对于wine对象,同时指定要搜索的对象的哪个键,如下所示:

var search = 'Noir'

filteredWines = function () {
  return wines.filter(function(wine){
    return (wine.wineName.toLowerCase().indexOf(search.toLowerCase())>=0;
  });
};
Run Code Online (Sandbox Code Playgroud)

返回:

[ { _id: '59a740b8aa06e549918b1fda',
    wineryName: 'Some Winery',
    wineName: 'Pinot Noir',
    wineColor: 'Red',
    imageLink: '/img/FortBerensPN.png' },
  { _id: '59a872244fd43b676a1f5f0e',
    wineryName: 'Winery 3',
    wineName: 'Pinot Noir',
    wineColor: 'Red',
    imageLink: '/img/FortBerensPN.png' } ]
Run Code Online (Sandbox Code Playgroud)

但是,如果var search = 'Winery 3'var search = 'red'那么它显然不会返回任何结果,因为它正在查看wineName数组中每个对象的值.

那么有没有办法使用过滤器(或另一种方法?)来搜索所有键值,甚至更好地搜索多个指定键值并返回匹配对象的数组?

就像是:

filteredWines = function () {
  return wines.filter(function(wine){
    return ((wine.wineName.toLowerCase() && wine.wineName.toLowerCase() 
          && wine.wineName.toLowerCase()).indexOf(search.toLowerCase())>=0;
  });
};
Run Code Online (Sandbox Code Playgroud)

还是我完全咆哮错误的树?

PS.我正在使用Vue.js 2,所以如果在vue中有更好的方式那么我就全都耳朵了!

tri*_*cot 11

您可以使用更通用的函数来扫描字符串的所有属性.循环遍历所有属性值,Object.values()some在匹配时立即使用以进行纾困:

filteredWines = function (search) {
    var lowSearch = search.toLowerCase();
    return wines.filter(function(wine){
        return Object.values(wine).some( val => 
            String(val).toLowerCase().includes(lowSearch) 
        );
    });
}
Run Code Online (Sandbox Code Playgroud)

如果您希望传递特定密钥以进行搜索:

filteredWines = function (search, keys) {
    var lowSearch = search.toLowerCase();
    return wines.filter(function(wine){
        return keys.some( key => 
            String(wine[key]).toLowerCase().includes(lowSearch) 
        );
    });
}
Run Code Online (Sandbox Code Playgroud)

打电话给

filteredWines('Winery 3', ['wineryName', 'wineName']);
Run Code Online (Sandbox Code Playgroud)

  • 节省了很多时间。谢谢。 (2认同)