键入Script以搜索Array对象中的多个属性

时间:2017-07-16 07:26:01

标签: arrays angular typescript

我正在使用Array.prototype.filter从Object name数组中搜索名字。我想修改我的搜索以搜索名字,如果不是,那么搜索姓氏。

student_name : any = [{name:"Udhay" ,  lname:"Ravi"},
                {name:"Sabari" , lname:"Raj"},
                {name:"Sachin" , lname:"Karthi"},
                {name:"Sudha" ,  lname:"Mohan"}]

search(){
var this.myInput = "Ravi"
this.student_name = this.student_name.filter((sn) => {               
return(sn.name.toLowerCase().indexOf(this.myInput.toLowerCase())> -1)
 })

}

有人可以帮我解决这个问题。我是TypeScript和Angular 2的新手

3 个答案:

答案 0 :(得分:1)

看起来像这样:

search() {
    this.myInput = "Ravi";

    // Convert it to lower case here to avoid lower case conversion twice inside filter.
    let searchFilter = this.myInput.toLowerCase();

    this.student_name =
        this.student_name.filter(sn =>
            sn.name.toLowerCase() === searchFilter ||
            sn.lname.toLowerCase() === searchFilter);
}

filter函数会对每个元素执行比较,这就是为什么不需要使用indexOf的原因。它就像在初始数组中的每个元素上执行for循环,并在新数组中推送满足条件的元素,这些元素稍后将作为filter函数的结果返回。

修改

检查搜索字符串是否有任何名称或姓氏starts with

sn.name.toLowerCase().startsWith(searchFilter) ||
sn.lname.toLowerCase().startsWith(searchFilter)

检查搜索字符串是否有任何名称或姓氏contains

sn.name.toLowerCase().includes(searchFilter) ||
sn.lname.toLowerCase().includes(searchFilter)

答案 1 :(得分:0)

使用lodash

可以轻松实现
search(){
this.myInput = "Ravi"
this.result= _.filter(this.student_name, {'name':this.myInput});
if(_.isEmpty(this.result)){
  this.result=_.filter(this.student_name, {'lname':this.myInput})
 }
}

<强> LIVE DEMO

答案 2 :(得分:0)

我写了一个非常简单的库ss-search

对于您的情况,要搜索嵌套数组,请执行以下操作:

UPDATE Dayfile AS d
JOIN (
    SELECT DATE(LogDateTime) AS date, MAX(FeelsLike) AS feels
    FROM Monthly
    GROUP BY date
) AS m ON DATE(d.LogDate) = m.date
SET d.MaxFeelsLike = m.feels

这将过滤出数据,以仅返回名称或姓氏属性中包含“ Ravi”的结果。