2017-08-11 35 views
3

我想基于使用两种过滤方法的字符串过滤对象内的数组。这是我的对象的样子。使用自动完成功能在对象内过滤数组

[ 
    { 
    "cat": "Accommodation and Food Service Activities", 
    "value": [ 
     { 
     "sic": "55", 
     "desc": "Accommodation" 
     }, 
     { 
     "sic": "56", 
     "desc": "Food and beverage service activities" 
     } 
    ] 
    }, 
    { 
    "cat": "Activities Of Extraterritorial Organisations and Bodies", 
    "value": [ 
     { 
     "sic": "99", 
     "desc": "Activities of extraterritorial organisations and bodies" 
     } 
    ] 
    } 
] 

我想过滤的value.desc并返回cat

这里是我迄今为止

filteredIndustries(industry: string) { 
    if (industry) { 
     return this.industries.filter(sector => { 
     if (sector.value) { 
      sector.value.findIndex(v => { 
      return v.desc.toString().toLowerCase().indexOf(industry.toString().toLowerCase()) === 0; 
      }); 
     } 
     }); 
    } else { 
     return this.industries; 
    } 

,这里是我的html,

<md-input-container> 
     <input mdInput placeholder="Industry" [mdAutocomplete]="auto" [formControl]="industryCtrl"> 
    </md-input-container> 

    <md-autocomplete #auto="mdAutocomplete" [displayWith]="displayIndustry.bind(this)"> 
     <md-option *ngFor="let industry of filteredIndustry | async" [value]="industry"> 
     {{ industry.cat }} 
     </md-option> 
    </md-autocomplete> 

所以当我输入食物时,它应该过滤value.desc并返回cat这应该是Accommodation and Food Service Activities

但我没有得到,即使我的返回结果为true的返回值。

任何帮助将不胜感激。

+0

欢迎SO!这是一个很好的第一个问题,您发布了代码并正确解释了您的问题,使您可以轻松地为您提供帮助。 +1 –

回答

1

您的filter回调函数未命中返回语句,如果findIndex返回大于-1的东西,则应返回true;

filteredIndustries(industry: string) { 
    if (industry) { 
     return this.industries.filter(sector => { 
     if (sector.value) { 
      return -1 < sector.value.findIndex(v => { //HERE 
      return v.desc.toString().toLowerCase().indexOf(industry.toString().toLowerCase()) === 0; 
      }); 
     } 
     }); 
    } else { 
     return this.industries; 
    } 
} 
+1

这只是你传递给filter()的函数总是返回undefined,它是一个“falsy”值,所以它过滤掉了数组中的所有元素this.industries –

+0

感谢您的帮助,这帮助我得到它工作。 – Ergun

0

可以使用some()代替findIndex()indexOf如果未找到指定的字符串,则返回-1。

var industries = [ 
 
    { 
 
    "cat": "Accommodation and Food Service Activities", 
 
    "value": [ 
 
     { 
 
     "sic": "55", 
 
     "desc": "Accommodation" 
 
     }, 
 
     { 
 
     "sic": "56", 
 
     "desc": "Food and beverage service activities" 
 
     } 
 
    ] 
 
    }, 
 
    { 
 
    "cat": "Activities Of Extraterritorial Organisations and Bodies", 
 
    "value": [ 
 
     { 
 
     "sic": "99", 
 
     "desc": "Activities of extraterritorial organisations and bodies" 
 
     } 
 
    ] 
 
    } 
 
] 
 

 
var industry = 'food' 
 
var b = industries.filter(sector => { 
 
    if (sector.value) { 
 
    return sector.value.some(v => v.desc.toLowerCase().indexOf(industry) >= 0); 
 
    } else { 
 
    return industries 
 
    } 
 
}); 
 

 
console.log(b)

+0

不幸的是,这并没有返回一个值。不管怎么说,还是要谢谢你。整理出 – Ergun

+1

我编辑了我的答案,以证明我的代码有效。 – kulaeff