当字符串部分或完全匹配对象中的值时,希望此函数返回

时间:2016-02-17 20:12:18

标签: javascript filtering lodash

我正在尝试使用javascript和lodash进行过滤。使用输入字段执行搜索,我希望此函数在this.props.search部分或完全匹配file对象中的值时返回。不使用对象的键名。

let files = [{
    'id': '00001',
    'fileName' : 'Test01.test',
    'size': 105,
    'uploadDate' : '2016-02-12',
    'permissions' : 'Private'
}, {
    'id': '00002',
    'fileName' : 'Test02.test',
    'size': 111,
    'uploadDate' : '2016-02-10',
    'permissions' : 'Private'
}, {
    'id': '00003',
    'fileName' : 'Test03.test',
    'size': 55,
    'uploadDate' : '2016-02-06',
    'permissions' : 'Shared'
}];

let filteredFiles = files.filter((file) => {
    return _.includes(file, this.props.search);
});

但是使用该功能只有在完全匹配字符串时才会起作用。我究竟做错了什么?如果有建议,我愿意不使用lodash。

更新

我最终使用以下内容:

   let filteredFiles = this.props.files.filter((file) => {
        for (let prop in file) {
            let string = String(file[prop]).toLowerCase();
            if (string.indexOf(this.props.search.toLowerCase()) >= 0) {
                return true;
            }
        }
        return false;
    });

3 个答案:

答案 0 :(得分:2)

遍历所有属性并检查您的搜索值是否在任何属性中。

let filteredFiles = files.filter((file) => {
    for (var prop in file) {
       var val = file[prop];
       if (val === this.props.search || String(val).includes(this.prop.search)) {
           return true;
       }
    }
    return false;
});

或者这是一个更像Lodash的版本,但仍然是VanillaJS,受到Amit的回答的启发。

"use strict";
function filter(files, value) {
  return files.filter(file => {
    return Object.keys(file).some(key => {
      return file[key] === value || String(file[key]).includes(value);
    });
  });
}



let files = [{
  'id': '00001',
  'fileName': 'Test01.test',
  'size': 105,
  'uploadDate': '2016-02-12',
  'permissions': 'Private'
}, {
  'id': '00002',
  'fileName': 'Test02.test',
  'size': 111,
  'uploadDate': '2016-02-10',
  'permissions': 'Private'
}, {
  'id': '00003',
  'fileName': 'Test03.test',
  'size': 55,
  'uploadDate': '2016-02-06',
  'permissions': 'Shared'
}];


document.write('Filtering by Pri: ' + filter(files, 'Pri').length + ' matches<br/>');
document.write('Filtering by 105: ' + filter(files, '105').length + ' matches<br/>');

答案 1 :(得分:2)

基本上,您希望将let filteredFiles = files.filter((file) => { return _.some(file, _.partial(_.includes, _, this.props.search, 0)); }); 函数应用于每个属性值(或更准确地说,直到找到匹配项),而不是对象本身。

试试这个:

{{1}}

答案 2 :(得分:0)

因为您将对象作为第一个参数传递给_.includes,所以它会检查file中存储的任何值是否具有this.props.search的确切值。如果要查看特定字段是否匹配,则应传递该字段名称,然后它将搜索字符串部分而不是完全匹配。例如:

let filteredFiles = files.filter((file) => {
   return _.includes(file.fileName, this.props.search);
});