Lodash过滤器:在对象的所有值中进行筛选

3

我正在使用 Lodash 进行对象的过滤。

var search = 180;
var filterBy = "other_num";

var items = [{
  id: 1,
  name: 'Fulano da Silva 1',
  num: 300,
  other_num: 183,
  date: '05/04/2018'
}, {
  id: 2,
  name: 'Amanda',
  num: 250,
  other_num: 180,
  date: '12/03/2018'
}, {
  id: 3,
  name: 'Fulano da Silva 3',
  num: 300,
  other_num: 211,
  date: '02/03/2018'
}, {
  id: 4,
  name: 'Fulano da Silva 4',
  num: 300,
  other_num: 211,
  date: '02/03/2018'
}, ];

var filtered = _.filter(items, function(item) {
  return (item[filterBy].toString().toLowerCase().indexOf( search.toString().toLowerCase()) > -1);
});

console.log(filtered);

如您所见,我已经设置了searchfilterBy变量。但是,我想知道是否有可能在任何键中查找search的值,而不是“按关键字筛选”。
像这样的东西:
var filtered = _.filter(items, function(item) {
  return (item.id.toString().toLowerCase().indexOf(search.toString().toLowerCase()) > -1) || (item.name.toString().toLowerCase().indexOf(search.toString().toLowerCase()) > -1) || (item.num.toString().toLowerCase().indexOf(search.toString().toLowerCase()) > -1) || (item.other_num.toString().toLowerCase().indexOf(search.toString().toLowerCase()) > -1) || (item.date.toString().toLowerCase().indexOf(search.toString().toLowerCase()) > -1);
});

虽然上面的代码可以工作(请参见this fiddle并检查控制台),但它不是动态的也不可重用。我的意思是,如果需要添加/删除键,则必须手动从return中添加/删除指令。

有没有想法如何使其更加智能可重用?我是否错过了一些 Lodash 功能?

提前致谢 :)

2个回答

4

但我想知道是否可能在任何键中查找搜索的值,而不是按关键字筛选。

使用原生JS的方法 - 尝试使用Object.values

var search = 180;
var output = items.filter( s => Object.values( s ).includes( search ) );

示例

var search = 180;

var items = [{
  id: 180, //changed for the purpose of testing
  name: 'Fulano da Silva 1',
  num: 300,
  other_num: 183,
  date: '05/04/2018'
}, {
  id: 2, 
  name: 'Amanda',
  num: 250,
  other_num: 180,
  date: '12/03/2018'
}, {
  id: 3,
  name: 'Fulano da Silva 3',
  num: 300,
  other_num: 211,
  date: '02/03/2018'
}, {
  id: 4,
  name: 'Fulano da Silva 4',
  num: 300,
  other_num: 211,
  date: '02/03/2018'
}];
var output = items.filter( s => Object.values( s ).includes( search ) );
console.log( output );


很棒!你的答案是正确的。现在我需要找到一种方法,在Vue.js上让它工作,一旦用户输入“搜索”项。你看,过滤器起作用当我输入完全相同的“Amanda”,“Fulano da Silva 1”,或任何_exact_字符串时。当我输入“250”时,它不起作用,因为值中没有这样的_string_。我认为最好提一个新问题。谢谢 :) - Eric Gruby
抱歉发了两次评论 xD 我只是将返回值更改为 return app.items.filter( s => Object.values( s ).toString().toLowerCase().indexOf( app.search ) > -1 );,然后它按预期工作了。非常感谢你的帮助 :) - Eric Gruby

0

关于(ES6)的问题:

_.filter(items, { [filterBy]: search });

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接