2017-07-15 98 views
1

我使用JavaScript数组过滤器通过关键字过滤一些对象数组。初始,我有对象的数组:使用多个值过滤数组

let works = [ 
    { title: ' work 1', medium: 'tax1' }, 
    { title: ' work 2', medium: 'tax2' }, 
    { title: ' work 3', medium: 'tax3' }, 
    { title: ' work 4', medium: 'tax2' }, 
    { title: ' work 5', medium: 'tax1' } 
    ] 

并且通过以这样的方式“中”可过滤的数组:

mediumFilter(taxonomy) { 
     return works.filter(item => { 
      return (
       item.medium.indexOf(taxonomy) > -1 
      ); 
     }); 
    }, 

当我通过分类变量到mediumFilter( ),在这种情况下'tax1'左右 - 我得到一个数组,其中包含包含该特定介质的项目。

这是最初的 - 现在我的项目越来越复杂,我发现自己在挣扎。我的新数组包含一个嵌套数组,它们是要在过滤中匹配的值。

let works = [ 
    { title: ' work 1', medium: [ 'tax1', 'tax3' ] }, 
    { title: ' work 2', medium: [ 'tax1' ] }, 
    { title: ' work 3', medium: [ 'tax3' ] }, 
    { title: ' work 4', medium: [ 'tax2', 'tax1' ] }, 
    { title: ' work 5', medium: [ 'tax1' ] } 
    ] 

请注意介质是如何保持多个字符串的数组。

我正在寻找一些关于如何解决这个问题的帮助。我需要我的函数来返回匹配变量im传递的项目。由于一些作品可能有多种媒介,我需要能够通过多种价值进行筛选。如果媒体阵列具有多个值,则只需匹配一个值。

谢谢!

btw即时通讯使用与问题无关的vue,但我的示例的语法可能并不准确。

+1

这个'mediumFilter(['tax3','tax2'])''应该是什么结果? – RomanPerekhrest

+0

嗨 - 用户只能在这个阶段过滤一个类别,所以传递给函数的变量将永远是单个字符串!仍然这是非常重要的考虑 – mmarquez

回答

1

您可以使用Array#includes并检查字符串。

let works = [{ title: 'work 1', medium: ['tax1', 'tax3'] }, { title: 'work 2', medium: ['tax1'] }, { title: 'work 3', medium: ['tax3'] }, { title: 'work 4', medium: ['tax2', 'tax1'] }, { title: 'work 5', medium: ['tax1'] }], 
 
    mediumFilter = taxonomy => works.filter(item => item.medium.includes(taxonomy)); 
 

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

+0

这正是我所期待的:〜)!非常感谢 – mmarquez

0
mediumFilter(taxonomy) { 
    return works.forEach(item => { 
     for(let i = 0; i < item.medium.length; i++){ 
      if(item.medium[i].indexOf(taxonomy) > -1){ 
       return true; 
      } 
     } 
     return false; 
    }); 
}, 

我相信这是你的想法。如果分类是一个数组(而且永远是,没有做mediumFilter('tax1')mediumFilter(['tax1','tax2'])那么你可以这样做,以及:

mediumFilter(taxonomy) { 
    return works.forEach(item => { 
     for(let i = 0; i < item.medium.length; i++){ 
      for(elem of taxonomy){ 
       if(item.medium[i].indexOf(elem) > -1){ 
        return true; 
       } 
      } 
     } 
     return false; 
    }); 
}, 
+0

谢谢!这种方法帮助我理解实现我想要的逻辑所需的逻辑!在我的情况下,我期待它返回一个新的数组 - 而不是一个布尔值。我更新了我的问题! – mmarquez

0

如果我收到了你的问题的权利那么这应该工作:

function mediumFilter(taxonomy) { 
    return works.filter(x => x.medium.indexOf(taxonomy) > -1); 
} 
+0

谢谢!实际上,这是我最初的方法 - 如果Array _works_属性_medium_是单个字符串,则它可以工作。因为我的_medium_现在是一个数组,所以需要一些嵌套的逻辑来检查多个匹配 – mmarquez

0

你可以修改接受该对象及搜索查询阵列功能

function mediumFilter(taxonomy) { 
 
    taxonomy = Array.isArray(taxonomy) ? taxonomy : [taxonomy]; 
 
    return works.filter(item => { 
 
     let medium = Array.isArray(item.medium) ? item.medium : [item.medium]; 
 
     return taxonomy.some(med => medium.includes(med)); 
 
    }); 
 
} 
 

 
let works = [ 
 
    {title: ' work 1', medium: ['tax1', 'tax2']}, 
 
    {title: ' work 2', medium: 'tax2'}, 
 
    {title: ' work 3', medium: 'tax3'}, 
 
    {title: ' work 4', medium: 'tax4'}, 
 
    {title: ' work 5', medium: 'tax5'} 
 
]; 
 

 
function log(x) {console.log(x.map(y => y.title))} 
 

 
log(mediumFilter('tax1'));   // 1 
 
log(mediumFilter(['tax1', 'tax2'])); // 1, 2 
 
log(mediumFilter('tax2'));   // 1, 2 
 
log(mediumFilter(['tax4']));   // 4

0

let works = [ 
 
    { title: ' work 1', medium: [ 'tax1', 'tax3' ] }, 
 
    { title: ' work 2', medium: [ 'tax1' ] }, 
 
    { title: ' work 3', medium: [ 'tax3' ] }, 
 
    { title: ' work 4', medium: [ 'tax2', 'tax1' ] }, 
 
    { title: ' work 5', medium: [ 'tax1' ] } 
 
] 
 

 
    function mediumFilter(taxonomy) { 
 
     return works.filter(item => { 
 
      return item.medium.filter(subitem => { 
 
       return (
 
        subitem.indexOf(taxonomy) > -1 
 
      ); 
 
      }); 
 
     }); 
 
    } 
 

 
    console.log(mediumFilter('tax1'));

0

你应该避免嵌套循环。我会改变数据结构,以适应更高效的搜索。 {tax1:['work 1','work 2'], tax2:[],}