Javascript 搜索所有json';使用lodash.js创建s元素

Javascript 搜索所有json';使用lodash.js创建s元素,javascript,json,lodash,Javascript,Json,Lodash,friens我有对象json: var companies= [ { id: 1, name: "Test Company", admin: "Test Admin" }, { id: 2, name: "Another Company", admin: "Test Admin", country: 'Spain' }, { id: 3, name: "New Company", admin: "Admin 4" }, { id: 4, name: "Free

friens我有对象json:

  var companies= [
    { id: 1, name: "Test Company", admin: "Test Admin" },
    { id: 2, name: "Another Company", admin: "Test Admin", country: 'Spain' },
    { id: 3, name: "New Company", admin: "Admin 4" },
    { id: 4, name: "Free Company", admin: "Jhon Miller", city: 'New York' }
];
我正在编写一个返回新json的函数,其中包含作为参数传递的元素(过滤器)。我做了一个简单的决定

   function searchBooks(companies,filter){
    var result;
      if (typeof filter=== "undefined" ||  filter.length==0) {
          result = companies;
      } else {
        result = _.filter(companies, function (c) {
         return _.includes(_.lowerCase(c.name),_.lowerCase(filter));
       });
     }
 }
使用我的函数,我只能按名称进行筛选,我的问题是:如何按名称、管理员、国家/地区、城市(除id外)进行筛选,例如,如果在变量中传递4,则应返回:

{id:3,名称:“新公司”,管理员:“管理员4”}

或者如果我搜索了,我应该返回:

{id:4,名字:“自由公司”,管理员:“约翰·米勒”,城市:'纽约'}


谢谢

如何以相同的方式搜索每个属性,指定您的潜在搜索键,请参阅
searchBooksSpecificProperties

或者,如果您始终希望搜索所有字段,则可以使用
\uu0.keys()
获取每个项目的键,请参阅
searchBooks

var公司=[
{id:1,名称:“测试公司”,管理员:“测试管理员”},
{id:2,名称:“另一家公司”,管理员:“测试管理员”,国家:'西班牙'},
{id:3,名称:“新公司”,管理员:“管理员4”},
{id:4,名字:“自由公司”,管理员:“约翰·米勒”,城市:'纽约'}
];
功能搜索簿(公司、过滤器){
var结果;
if(typeof filter==“undefined”| | filter.length==0){
结果=公司;
}否则{
结果=\过滤器(公司,函数(c){
var cProperties=u0.keys(c);
_.拉动(cProperties,'id');
return u.find(cProperties、function(property){
if(c[属性]){
返回u0.includes(0.lowerCase(c[property]),0.lowerCase(filter));
}          
});         
});
}
返回结果;
}
console.log('searchBooks:');
日志(searchBooks(公司,'Admin4'))
console.log(searchbook(公司,'York'))
函数属性(属性、公司、筛选器){
var searchSpecificProperties=u.isArray(属性);
var结果;
if(typeof filter==“undefined”| | filter.length==0){
结果=公司;
}否则{
结果=\过滤器(公司,函数(c){
var cProperties=searchSpecificProperties?属性:\关键字(c);
return u.find(cProperties、function(property){
if(c[属性]){
返回u0.includes(0.lowerCase(c[property]),0.lowerCase(filter));
}          
});         
});
}
返回结果;
}
log('searchBooksSpecificProperties:');
log(searchBooksSpecificProperties(['name','admin'],companys,'admin 4'))
log(searchBooksSpecificProperties(['name','admin',companys','York'))
对象。键()
是键;)

试试这个:

var公司=[
{id:1,名称:“测试公司”,管理员:“测试管理员”},
{id:2,名称:“另一家公司”,管理员:“测试管理员”,国家:'西班牙'},
{id:3,名称:“新公司”,管理员:“管理员4”},
{id:4,名字:“自由公司”,管理员:“约翰·米勒”,城市:'纽约'}
];
函数searchBooks(过滤器){
var结果;
if(typeof filter==“undefined”| | filter.length==0){
结果=公司;
}否则{
结果=\过滤器(公司,函数(c){
//此部分将转换单个字符串中的每个属性值。
var searchIn=Object.keys(c).reduce(函数(res,val){return(val!='id')?res+c[val]:res}',);
返回u0.includes(0.lowerCase(searchIn),0.lowerCase(filter));
});
}
console.log(结果)
}

下面的搜索功能利用从
文本
搜索中获取匹配的对象。为了确定某个对象是否与搜索的
文本匹配,我们对集合中每个对象的所有值使用。
some()

请注意,我使用了,与之相反,因为后者将字符串转换为小写格式作为分隔字,而前者完全转换整个字符串,而不管字符串的大小写格式如何——您可以根据需要选择以其他方式进行切换

更新:在测试搜索的
文本中的对象值时,我添加了一个排除参数,作为某些属性的一种方式

function searchByText(collection, text, exclude) {
  text = _.toLower(text);
  return _.filter(collection, function(object) {
    return _(object).omit(exclude).some(function(string) {
      return _(string).toLower().includes(text);
    });
  });
}
console.log(searchByText(companies, '4'));
console.log(searchByText(companies, 'iLl'));
console.log(searchByText(companies, '4', ['id']));
var公司=[{
id:1,
名称:“测试公司”,
管理员:“测试管理员”
},
{
id:2,
名称:“另一家公司”,
管理员:“测试管理员”,
国家:“西班牙”
},
{
id:3,
名称:“新公司”,
管理员:“管理员4”
},
{
id:4,
名称:“自由公司”,
管理员:“约翰·米勒”,
城市:“纽约”
}
];
函数searchByText(集合、文本、排除){
text=uu.toLower(text);
返回过滤器(集合、函数(对象){
return(对象).omit(排除).some(函数)(字符串){
return(字符串).toLower().includes(文本);
});
});
}
console.log(searchByText(companys,'4'));
log(searchByText(companys,'iLl'));
log(searchByText(公司,'4',['id'])
body>div{min height:100%;top:0;}

那不是,它是一个对象数组。JSON是一种数据交换格式,其格式类似于JS的子集。字符串
'[{id:1},{id:2}]
是JSON格式的数据,可以放入JS数组:
[{id:1},{id:2}]
。这看起来像是语义,但这是一个重要的区别。谢谢@SteevePitis,您的解决方案是有效的,但我需要知道如何排除筛选器的ID,因为如果我写4个show 2寄存器,应该只显示1。如果您只想显示第一个结果,那么您只需
返回结果[0]
我知道这一点,但我的问题是,在搜索时是否可以排除id。假设另一个寄存器有“4”,应该返回2个寄存器3。谢谢我真的不知道你想要什么