我正在尝试使用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;
});
答案 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);
});