【问题标题】:How do I filter an array of objects by keyword using LoDash?如何使用 LoDash 按关键字过滤对象数组?
【发布时间】:2016-08-04 05:45:45
【问题描述】:

假设我有一个这样的对象数组:

[{
  away: "Seattle Seahawks",
  home: "Kansas City Chiefs",
},
{
  away: "Houston Texans",
  home: "San Francisco 49ers",
},
{
  away: "Dallas Cowboys",
  home: "Los Angeles Rams",
}]

要求:

搜索每个对象并搜索关键字 49er 并让它返回对象 #2。

在每个对象中搜索关键字 cow 并让它返回对象 #3。

在每个对象中搜索关键字an 并让它返回所有三个对象。

在 lodash 中实现这一目标的最佳方法是什么?谢谢!

【问题讨论】:

    标签: javascript lodash


    【解决方案1】:

    我的解决方案_.flow

    const my_arr = [{
      away: "Seattle Seahawks",
      home: "Kansas City Chiefs",
    },
    {
      away: "Houston Texans",
      home: "San Francisco 49ers",
    },
    {
      away: "Dallas Cowboys",
      home: "Los Angeles Rams",
    }]
    
    function flowFilter(array, substr) {
        return _.filter(array, _.flow(
        _.identity,
        _.values,
        _.join,
        _.toLower,
        _.partialRight(_.includes, substr)
      ));
    }
    
    const one = flowFilter(my_arr, '49er');
    const two = flowFilter(my_arr, 'cow');
    const three = flowFilter(my_arr, 'an');
    
    console.log('one', one);
    console.log('two', two);
    console.log('three', three);
    

    https://jsfiddle.net/1321mzjw/

    【讨论】:

      【解决方案2】:

      lodash 库无需使用原生 JavaScript 方法。

      var data = [{
        away: "Seattle Seahawks",
        home: "Kansas City Chiefs",
      }, {
        away: "Houston Texans",
        home: "San Francisco 49ers",
      }, {
        away: "Dallas Cowboys",
        home: "Los Angeles Rams",
      }];
      
      console.log(
        // filter the array
        data.filter(function(v) {
          // get all keys of the object
          return Object.keys(v)
          // iterate and check for any object property value cotains the string
          .some(function(k) {
            // convert to lowercase(to make it case insensitive) and check match
            return v[k].toLowerCase().indexOf('49ers') > -1;
          })
        })
      );
      
      console.log(
        data.filter(function(v) {
          return Object.keys(v).some(function(k) {
            return v[k].toLowerCase().indexOf('an') > -1;
          })
        })
      );

      【讨论】:

        【解决方案3】:

        我能想到的最短的是

        // lodash
        data.filter(d => _.some(d, t => /cow/i.test(t)))
        
        // plain js
        data.filter(d => Object.keys(d).some(k => /cow/i.test(d[k])))
        

        【讨论】:

          【解决方案4】:

          您也可以使用纯 JavaScript。

          const my_arr = [{
            away: "Seattle Seahawks",
            home: "Kansas City Chiefs",
          },
          {
            away: "Houston Texans",
            home: "San Francisco 49ers",
          },
          {
            away: "Dallas Cowboys",
            home: "Los Angeles Rams",
          }]
          
          
          
          const filterByText = (arr, text) => {
            return arr.filter((item) => (
              !(
                item.away.toLowerCase().indexOf(text) === -1 && 
                item.home.toLowerCase().indexOf(text) === -1
              )
            )
          )}
          
          console.log(filterByText(my_arr, '49er')) // #2
          console.log(filterByText(my_arr, 'cow')) // #3
          console.log(filterByText(my_arr, 'an')) // #1, #2, #3
          

          在这种情况下使用 lodash 几乎是相似的,因为您需要使用 toLoverCase。

          const filterByText = (arr, text) => {
          
            return _.filter(arr, (obj) => { 
              return Object.keys(obj).some((key) =>
                return obj[key].toLowerCase().indexOf(text) !== -1;
              )
            }
          
          )}
          

          【讨论】:

            【解决方案5】:

            我喜欢将正则表达式与 lodash 函数结合起来。此场景适用。创建一个接受集合和RegExp 的通用函数以进行搜索:

            function myFilter(coll, regex) {
              return _.filter(
                coll,
                _.unary(_.partialRight(_.some, _.method('match', regex)))
              );
            }
            

            现在您可以将任何您想要的正则表达式传递给myFilter(),它将针对coll 中每个对象的所有属性值进行测试。使用方法如下:

            myFilter(data, /49er/);
            // ➜ [
            //     {
            //       away: "Houston Texans",
            //       home: "San Francisco 49ers",
            //     }
            //   ]
            
            myFilter(data, /cow/i);
            // ➜ [
            //     {
            //       away: "Dallas Cowboys",
            //       home: "Los Angeles Rams",
            //     }
            //   ]
            
            myFilter(data, /an/);
            // ➜ [
            //     {
            //       away: "Seattle Seahawks",
            //       home: "Kansas City Chiefs",
            //     },
            //     {
            //       away: "Houston Texans",
            //       home: "San Francisco 49ers",
            //     },
            //     {
            //       away: "Dallas Cowboys",
            //       home: "Los Angeles Rams",
            //     }
            //   ]
            

            这里是使用的 lodash 函数的总结:

            • filter():通过评估每个项目的谓词函数来过滤集合。
            • unary():使函数只接受第一个参数,忽略所有其他参数。
            • partialRight():从右侧部分应用函数参数。当使用更多参数调用结果函数时,它们会向左移动。
            • some():如果集合中的任何项目对于给定谓词计算为真,则为真。
            • method():在给定对象参数上调用方法名称。还接受部分应用的参数。

            【讨论】:

              猜你喜欢
              • 2015-08-23
              • 2016-05-24
              • 1970-01-01
              • 2012-02-09
              • 1970-01-01
              • 2018-08-22
              • 2022-01-18
              • 1970-01-01
              相关资源
              最近更新 更多