【问题标题】:How to filter array on any matching value using lodash?如何使用lodash过滤任何匹配值的数组?
【发布时间】:2018-02-27 08:56:34
【问题描述】:

所以我有一些对象,我希望能够搜索任何匹配的值。

例如:

let arr = [
    {
        a: 'foo',
        b: 'bar'
    },
    {
        a: 'bar',
        b: 'baz'
    },
    {
        a: 'foo',
        b: 'baz'
    }
];

并且我希望能够过滤数组以包含任何具有值为“foo”的属性的对象。

有没有办法用 lodash 做到这一点?比如:

_.filter(arr, function(obj) {
    return obj.anyPropertiesMatch('bar');
});

【问题讨论】:

标签: javascript arrays lodash


【解决方案1】:

您可以使用Array.filter() 并检查值是否存在,使用Object.values() 获取值数组,并使用Array.includes() 检查它们是否包含val

const val = 'foo';

const arr = [{"a":"foo","b":"bar"},{"a":"bar","b":"baz"},{"a":"foo","b":"baz"}];

const result = arr.filter((o) => Object.values(o).includes(val));

console.log(result);

或使用_.includes() 的lodash 等效项:

const val = 'foo';

const arr = [{"a":"foo","b":"bar"},{"a":"bar","b":"baz"},{"a":"foo","b":"baz"}];

const result = _.filter(arr, (o) => _.includes(o, val));

console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

  • 请注意,箭头函数和Object.values 都可能需要将代码转译为 ES5。
【解决方案2】:

在 lodash 中,您可以使用 some 方法来验证该对象是否具有具有提供值的字段:

let arr = [
  { a: 'foo', b: 'bar' },
  { a: 'bar', b: 'baz' },
  { a: 'foo', b: 'baz' }
];

let result = _.filter(arr, obj => _.some(obj, val => val === 'foo'));
console.log(result);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案3】:

    使用 LoDash _.filter 根据对象值过滤数组,使用_.values 获取并使用_.includes 进行检查

    let arr = [
        {
            a: 'foo',
            b: 'bar'
        },
        {
            a: 'bar',
            b: 'baz'
        },
        {
            a: 'foo',
            b: 'baz'
        }
    ];
    
    let res = _.filter(arr, o => _.includes(_.values(o), 'foo'));
    
    console.log(res)
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

    【讨论】:

      【解决方案4】:

      就这么简单:

      _.filter(arr, o=>_.includes(o,'foo'));

      您可以直接对任何对象使用 lodash 数组函数,它会针对每个元素考虑每个值。

      这是一个适合您的工作示例:

      let arr = [
          {
              a: 'foo',
              b: 'bar'
          },
          {
              a: 'bar',
              b: 'baz'
          },
          {
              a: 'foo',
              b: 'baz'
          }
      ];
      
      let res = _.filter(arr, o=>_.includes(o,'foo'));
      console.log(res)
      <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.js"></script>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-05
        • 2013-06-19
        • 2021-11-11
        • 2019-10-09
        • 2017-02-19
        • 1970-01-01
        • 1970-01-01
        • 2014-03-31
        相关资源
        最近更新 更多