使用对象数组的所有字段进行字符串搜索

时间:2019-01-11 08:51:29

标签: javascript salesforce-lightning

我有对象列表/数组,它在表格中对齐。无论任何特定领域,我都必须实现搜索功能。换句话说,无论我在搜索文本框中搜索的内容是表的任何字段值包含字符串还是与字符串匹配,它都应该显示这些记录。

我已经编写了实现此功能的代码。但是我觉得这在算法方面不是很有效。

Input : <br/>
1. List of objects : [{ id : 1 ,  name : 'abc' , phone : 1234}, { id : 2 ,  name : 'abd' , phone : 3456} , { id : 3 ,  name : 'xyz' , phone : 5678}]
2. Field Api Names = ['id','name','phone']
3. Search string: '3'

Output: 
All 3 objects in the list must be the result. As phone number contains the number 3 in List[0] and List[1] + Id field of List[2] contains value 3.

代码:

function searchRecord(fieldApiList,records,searchStr){
    var filteredResults = []
    for(var i = 0 ; i < records.length ; i++){
        for(var j = 0 ; j < fieldApiList.length ; j++){
            var filedApi = fieldApiList[j];
            if(records[i].hasOwnProperty(filedApi)){
                var data = String(records[i][filedApi]).toLowerCase();
                if( data.includes(searchStr.toLowerCase())){
                    filteredResults.push(records[i]);
                }
            }
        }
    }
    return filteredResults;
}

// Invoke the method
var records = [
           { id : 1 ,  name : 'abc' , phone : 1234}, 
           { id : 2 ,  name : 'abd' , phone : 3456}, 
           { id : 3 ,  name : 'xyz' , phone : 5678}
];
var fieldApiList = ['id','name','phone'];
var searchStr = '3';
var searchResults = searchRecord(fieldApiList,records,searchStr)

我需要什么是最好的搜索功能才能在对象列表的所有字段上进行搜索。 该功能适用​​于Salesforce的闪电组件

1 个答案:

答案 0 :(得分:1)

我想您想将所有内容都作为字符串进行比较,因此您可以考虑使用具有适当测试功能的 filter

var records = [
  { id : 1 ,  name : 'abc' , phone : 1234}, 
  { id : 2 ,  name : 'abd' , phone : 3456}, 
  { id : 3 ,  name : 'xyz' , phone : 5678}
];

function findInValues(arr, value) {
  value = String(value).toLowerCase();
  return arr.filter(o =>
    Object.entries(o).some(entry =>
      String(entry[1]).toLowerCase().includes(value)
    )
  );
}

console.log(findInValues(records,  3));
console.log(findInValues(records, 'a'));
console.log(findInValues(records, 'z'));
console.log(findInValues(records, 567));