2017-07-15 67 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:[],}