Javascript 如何获得;“未过滤”;数组项?

Javascript 如何获得;“未过滤”;数组项?,javascript,Javascript,假设我有一个数组,我通过调用myItems.filter(filterFunction1)对其进行过滤,并从中获取一些项 然后,我想对filterFunction1未选择的其余项目运行另一个筛选函数filterFunction2 调用筛选函数后,是否可以获取遗漏的剩余项?您必须使用反向谓词重新运行筛选,这似乎是浪费。您应该减少项目,并将其放入两个箱子中的一个: const result = arr.reduce((res, item) => { res[predicate(item

假设我有一个数组,我通过调用
myItems.filter(filterFunction1)
对其进行过滤,并从中获取一些项

然后,我想对
filterFunction1
未选择的其余项目运行另一个筛选函数
filterFunction2


调用筛选函数后,是否可以获取遗漏的剩余项?

您必须使用反向谓词重新运行筛选,这似乎是浪费。您应该减少项目,并将其放入两个箱子中的一个:

const result = arr.reduce((res, item) => {
    res[predicate(item) ? 'a' : 'b'].push(item);
    return res;
}, { a: [], b: [] });

predicate
这里是您给
filter

的回调,您可以映射一个标志数组,然后根据标志值进行过滤

const cond=v=>!(v%2);
变量数组=[1,2,3,4,5],
标志=数组.map(cond),
result1=array.filter((_,i)=>flags[i]),
result2=array.filter((_,i)=>!flags[i]);
console.log(result1);

console.log(result2)不幸的是,没有基于
过滤器的一步解决方案。解决方案仍然是简单的一行:

这里有一个例子

const arr=[1,2,3,4,5,6,7,8];
常数筛选=arr.filter(x=>!!(x%2))
剩余常量=arr.filter(x=>!filtered.includes(x))

控制台日志(已过滤,剩余)
您可以使用
数组来实现。减少

const myItems = [...];

const { result1, result2 } = myItems.reduce(
  (result, item) => {
    if (filterFunc1(item)) {
      result.result1.push(item);
    } else if (filterFunc2(item)) {
      result.result2.push(item);
    }
    return result;
  },
  { result1: [], result2: [] },
);


如果您不想使用
reduce
,您可能希望迭代数组一次,并使用简单有效的
for..of
循环在一次快照中获取过滤和未过滤的项:

功能过滤器和添加过滤器(arr、过滤器回调){
常数res=[],[];
用于(arr的var项目){
res[~~过滤器回调(项目)]。推送(项目);
}
返回res;
}

const[unfiltered,filtered]=filterAndDiscriminate([1,2,3,4,5],i=>i有一种更简单易读的方法:

const array1 = []
const array2 = []
itemsToFilter.forEach(item => item.condition === met ? array1.push(challenge) : array2.push(challenge))

如果您还需要获取未筛选的项目,那么您可能根本不应该使用筛选。这听起来更像是
减少
并将项目合并到最终对象
{filtered:[…],unfiltered:[]}中的一项工作
。我实际上需要过滤项和未过滤项,但要分成数组。@SergeiBasharov那么你可能想使用
reduce
或生成器之类的工具,这样你只能循环数组一次。这是一种非常浪费的方法。@deceze我还没有做性能测试,但你可能是对的。性能仍然是nce成本通常可以忽略,这可能比复杂的reduce调用更具可读性。