【问题标题】:Search array of object with filter and keyword使用过滤器和关键字搜索对象数组
【发布时间】:2017-03-13 04:36:07
【问题描述】:

我有一个数组、过滤器和关键字。 我想使用过滤器和关键字在该数组中搜索,结果数组也是对象。就像第一个数组一样。

var data = [
  {email: "usera@gmail.com",nama:"User A", Level:"Super Admin"},
  {email: "userb@gmail.com",nama:"User B", Level:"Super Admin"},
  {email: "userc@gmail.com",nama:"User C", Level:"Standart"},
  {email: "userd@gmail.com",nama:"User D", Level:"Standart"},
  {email: "usere@gmail.com",nama:"User E", Level:"Admin"},
  {email: "userf@gmail.com",nama:"User F", Level:"Standart"}
];
var filter = "Level";
var keyword = "Standart";

//--------Search


console.log(data);

【问题讨论】:

    标签: javascript jquery arrays search


    【解决方案1】:

    您可以使用Array.prototype.filter 函数,该函数接受回调并进行相应的过滤。根据文档:

    filter() 方法创建一个新数组,其中包含通过所提供函数实现的测试的所有元素。

    回调是提供的函数,它接受三个参数。来自文档:

    callback

    函数是一个谓词,用来测试数组的每个元素。返回 true 保留元素,否则返回 false,取三个参数:

    element

    数组中正在处理的当前元素。

    index

    当前正在处理的元素在数组中的索引。

    array

    调用了数组过滤器。

    我们可以使用element 来检查当前元素并测试它是否应该被过滤,如下所示:

    var data = [
      {email: "usera@gmail.com",nama:"User A", Level:"Super Admin"},
      {email: "userb@gmail.com",nama:"User B", Level:"Super Admin"},
      {email: "userc@gmail.com",nama:"User C", Level:"Standart"},
      {email: "userd@gmail.com",nama:"User D", Level:"Standart"},
      {email: "usere@gmail.com",nama:"User E", Level:"Admin"},
      {email: "userf@gmail.com",nama:"User F", Level:"Standart"}
    ];
    var filter = "Level";
    var keyword = "Standart";
    
    var filteredData = data.filter(function(obj) {
    	return obj[filter] === keyword;
    });
    
    console.log(filteredData);

    在这里,我们使用回调(测试)来检查filter 中指定的当前元素(obj)的属性是否严格等于keyword。如果它通过,它会被保留,因此所有具有属性Level 和值Standart 的对象都会被保留。您也可以使用ES6 arrow functions 来缩短它:

    var filteredData = data.filter((obj) => obj[filter] === keyword);
    

    这只是上面的简写。它实际上是相同的,根据当前元素的 Level 属性是否严格等于 keyword 返回 true 或 false。

    【讨论】:

    • 如果关键字是通配符怎么办?在 mysql 中使用 %keyword% 我可以使用 /^keyword/ 吗?
    • @RenandattaRooziq 这真的不符合我的专业知识。如果您指的是正则表达式,请参阅here。可以这样应用:/regex/.test(obj[filter]).
    • 是的,我的意思是正则表达式
    • @RenandattaRooziq 那么是的。而不是obj[filter] === keyword/^keyword/.test(obj[filter])
    • @RenandattaRooziq 这样的事情? jsfiddle.net/yhdyb5bg/11 - 必要时使用JSON.stringify
    【解决方案2】:

    您可以使用array.prototype.filter() 函数通过自定义函数过滤数组:

    var data = [
      {email: "usera@gmail.com",nama:"User A", Level:"Super Admin"},
      {email: "userb@gmail.com",nama:"User B", Level:"Super Admin"},
      {email: "userc@gmail.com",nama:"User C", Level:"Standart"},
      {email: "userd@gmail.com",nama:"User D", Level:"Standart"},
      {email: "usere@gmail.com",nama:"User E", Level:"Admin"},
      {email: "userf@gmail.com",nama:"User F", Level:"Standart"}
    ];
    var filter = "Level";
    var keyword = "Standart";
    
    //--------Search
    var filtered_data = data.filter(function(item) {
        return item[filter] == keyword
    })
    
    console.log(filtered_data);
    

    【讨论】:

      【解决方案3】:

      您可以使用filter() 函数根据以下条件过滤掉元素:

      > var data = [
        {email: "usera@gmail.com",nama:"User A", Level:"Super Admin"},
        {email: "userb@gmail.com",nama:"User B", Level:"Super Admin"},
        {email: "userc@gmail.com",nama:"User C", Level:"Standart"},
        {email: "userd@gmail.com",nama:"User D", Level:"Standart"},
        {email: "usere@gmail.com",nama:"User E", Level:"Admin"},
        {email: "userf@gmail.com",nama:"User F", Level:"Standart"}
      ];
      > var newData=data.filter(function(x) { return x.Level == 'Standart'})
      > console.log(JSON.stringify(newData))
      [{"email":"userc@gmail.com","nama":"User C","Level":"Standart"},{"email":"userd@gmail.com","nama":"User D","Level":"Standart"},{"email":"userf@gmail.com","nama":"User F","Level":"Standart"}]
      

      【讨论】:

        【解决方案4】:

        您可以在这里使用数组过滤器方法来实现您的目标。

        var data = [{
          email: "usera@gmail.com",
          nama: "User A",
          Level: "Super Admin"
        }, {
          email: "userb@gmail.com",
          nama: "User B",
          Level: "Super Admin"
        }, {
          email: "userc@gmail.com",
          nama: "User C",
          Level: "Standart"
        }, {
          email: "userd@gmail.com",
          nama: "User D",
          Level: "Standart"
        }, {
          email: "usere@gmail.com",
          nama: "User E",
          Level: "Admin"
        }, {
          email: "userf@gmail.com",
          nama: "User F",
          Level: "Standart"
        }];
        var filter = "Level";
        var keyword = "Admin";
        
        var filteredArray = data.filter((item) => item[filter] === keyword);
        console.log(filteredArray);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-16
          • 2012-02-09
          • 2018-02-09
          • 2020-01-28
          • 2017-08-17
          • 1970-01-01
          相关资源
          最近更新 更多