【问题标题】:Search an object from a list with its partial attribute value从具有部分属性值的列表中搜索对象
【发布时间】:2017-11-21 09:05:06
【问题描述】:

我有一个从 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”-> 结果:(无)
  • 如果我搜索:“姓名”-> 结果:name1 Surname1,name2,name3Surname3,surname4

总结一下:

我应该搜索项目:

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

我已经尝试过 filter 解决方案,如下所示:

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 = [];
      }
  }

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

【问题讨论】:

    标签: javascript regex angular typescript


    【解决方案1】:

    使用过滤器并包含

    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)

    【讨论】:

      【解决方案2】:

      您可以使用 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; }

      【讨论】:

      • 这只会给我与我的列表对象值完全对应的结果。这对我来说还不够
      • 不,它没有,它给出id 包含搜索字符串的每个对象
      • 我想,他想要逗号分隔的 id。请在findItems返回语句中添加.map(function(item){ return item.id }).join(',');
      • @VipinKumar,我不这么认为,因为 “我的结果应该是其 IDS 包含我的搜索值项目的项目。”
      • 正确@NinaScholz,我认为问题不正确。也请看这个“如果我搜索:”name” -> 结果:name1 Surname1, name2, name3Surname3, surname4
      【解决方案3】:

      将名称字符串拆分为数组并循环遍历数组并与项目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;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-06-02
        • 2018-08-03
        • 2015-11-05
        • 2023-03-21
        • 1970-01-01
        • 2018-04-13
        相关资源
        最近更新 更多