同时使用数组过滤器

时间:2019-03-07 18:27:37

标签: javascript arrays

我想在array filter中应用两个条件。

实际上,我有以下代码:

arr = arr.filter(
    a => a.color != $(this).data('color'),
    b => b.name != $(this).data('name')
);

如何指定我需要过滤颜色和名称?

2 个答案:

答案 0 :(得分:0)

使用&&运算符检查两个条件

let arr = [
{color: 'blue', name: 'sky'},
{color: 'red', name: 'foo'},
{color: 'yellow', name: 'submarine'},
{color: 'red', name: 'velvet'}
];

arr = arr.filter(a => a.color !== $('#example').data('color') && a.name !== $('#example1').data('name'));

console.log(arr);
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="example" data-name="sky" data-color="blue">
</div>

答案 1 :(得分:0)

您可以编写一个用于组合谓词的小工具:

const pred = (() => {
  const and = p1 => p2 => x => p1(x) && p2(x)
  const or = p1 => p2 => x => p1(x) || p2(x)

  return { and, or }
})()

// ...

const isntSomeColor = a => a.color != $(this).data('color')
const isntSomeName = b => b.name != $(this).data('name')

const result = input.filter(pred.and(isntSomeColor)(isntSomeName))

一般而言,布尔连词和析取词均会形成等分线,而返回等分线的函数也会形成等分线。因此,如果您正在使用某些功能性编程库,则也可以这样做:

const preds = [
  a => a.color != $(this).data('color'),
  b => b.name != $(this).data('name')
]

const result = input.filter(arr.fold(fn(and))(preds))