从列表中搜索具有部分属性值

时间:2017-11-21 09:05:06

标签: javascript regex angular typescript

我有一个列表对象,我从Web服务加载。我的清单以这种形式出现:

list = [ {id:"name1 Surname1" , nb:120} ,
         {id:"name2", nb:632} , 
         {id:"name3Surname3", nb:102} , 
         {id:"surname4", nb:896} 
       ] 

我的搜索策略是通过" id" 。 如您所见,我有不同的格式:

用空格分隔名字 - 姓氏,仅名称,仅姓氏。

我的目的是通过id(其名称或姓氏值)搜索成员。 我的结果应该是IDS包含我的搜索值项目的项目。

例如:

  • 如果我搜索:" name1" - > 结果:name1 Surname1
  • 如果我搜索:" name1 Surn" - > 结果:name1 Surname1
  • 如果我搜索:" name1 SurAAA" - > 结果 :(没有)
  • 如果我搜索:" AAAA Surname1" - > 结果 :(没有)
  • 如果我搜索:" name1Surname1" - > 结果 :(没有)
  • 如果我搜索:" name" - > 结果:name1 Surname1,name2,name3Surname3,surname4

总结:

我应该搜索项目:

  • 对应我搜索的项目
  • 从我搜索的项目开始

我尝试过过滤器解决方案,如下所示:

findItems(name) {
      this.splits = name.toLowerCase().split(' ');
      if (this.splits.length >= 1) {
        results = this.namesList.filter(item => this.splits.indexOf(item.brand.toLowerCase()) !== -1);
      }else {
        results = [];
      }
  }

但此解决方案仅搜索与我的搜索项目完全相对应的项目,并且缺少部分搜索

3 个答案:

答案 0 :(得分:2)

使用过滤器并包含



let list = [ {id:"name1 Surname1" , nb:120} ,
         {id:"name2", nb:632} , 
         {id:"name3Surname3", nb:102} , 
         {id:"surname4", nb:896} 
       ] 
      
searchForString = (list,string) => {
    return list.filter((obj) => {
       return obj["id"].includes(string);
    });
}

let isPresent = searchForString(list,"name");

console.log(isPresent)




答案 1 :(得分:0)

您可以在不事先拆分的情况下使用indexOf。

function findItems(value) {
    value = value.toLowerCase();
    return list.filter(function (item) {
        return item.id.toLowerCase().indexOf(value) !== -1;
    });
}

var list = [{ id: "name1 Surname1", nb: 120 }, { id: "name2", nb: 632 }, { id: "name3Surname3", nb: 102 }, { id: "surname4", nb: 896 }];

console.log(findItems('name1'));
console.log(findItems('name1 Surn'));
console.log(findItems('name1 SurAAA'));
console.log(findItems('AAAA Surname1'));
console.log(findItems('ame1Surname1'));
console.log(findItems('name'));
.as-console-wrapper { max-height: 100% !important; top: 0; }

答案 2 :(得分:0)

将名称字符串拆分为数组并循环遍历数组并与项目ID进行比较

function findItems(name){
    var l = list.filter(function(obj) {
        var ks = name.split(" ");

        for(var i = 0; i < ks.length ; i++){
            return obj.id.indexOf(ks[i]) >= 0
        }
    }); 
return l;
}