如何从另一个数组的所有元素中过滤一个数组

IT技术 javascript arrays filter
2021-01-25 21:00:31


我想了解从另一个数组的所有元素中过滤数组的最佳方法我尝试使用过滤器功能,但我不知道如何给它我想要删除的值。
就像是:

var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallback);
// filteredArray should now be [1,3]


function myCallBack(){
    return element ! filteredArray; 
    //which clearly can't work since we don't have the reference <,< 
}

如果过滤器功能没有用,您将如何实现?
编辑:我检查了可能重复的问题,它对那些容易理解 javascript 的人很有用。检查为好的答案使事情变得容易。

6个回答

我会这样做;

var arr1 = [1,2,3,4],
    arr2 = [2,4],
    res = arr1.filter(item => !arr2.includes(item));
console.log(res);

包含仅适用于 ES7。如果您使用 ES6,请使用公认的解决方案。
2021-03-21 21:00:31
箭头函数 FTW。比旧学校的回调好得多!
2021-03-30 21:00:31
摇滚明星。谢谢,这对于解决稍微不同的问题非常有帮助。根据反应组件中的一组值过滤出一组对象: const filteredResults = this.state.cards.filter( result => !this.state.filterOut.includes(result.category) ) 其中 this.state.cards 在一组对象中,而 this.state.filterOut 是一组与对象中的“类别”键相对应的值我想删除。
2021-03-31 21:00:31
我知道,这是一个较旧的回应,但我只是想让你知道我更喜欢这个回应,它帮助我解决了我遇到的一个问题。它非常易读,因此我更容易更好地理解这个问题。
2021-04-08 21:00:31

您可以使用函数this参数filter()来避免将过滤器数组存储在全局变量中。

var filtered = [1, 2, 3, 4].filter(
    function(e) {
      return this.indexOf(e) < 0;
    },
    [2, 4]
);
console.log(filtered);

它就像一个魅力。是否可以将函数移到外面并以更易于理解的方式调用它?喜欢: var过滤=[1,2,3,4].filter(myfunct(),[2,4]);
2021-03-18 21:00:31
当然: var myFunct=function(e){return this.indexOf(e)<0;}; var 过滤=[1,2,3,4].filter(myFunct,[2,4]);
2021-03-23 21:00:31
这可以通过 ES2016 或 TypesScript 中的 lambda 表达式实现吗?
2021-03-24 21:00:31
当我使用这种方法时,过滤器的第二个参数没有作为this. this似乎总是未定义?!奇怪的
2021-03-28 21:00:31
var array = [1,2,3,4];
var anotherOne = [2,4];
var filteredArray = array.filter(myCallBack);

function myCallBack(el){
  return anotherOne.indexOf(el) < 0;
}

在回调中,您检查每个值array是否在anotherOne

https://jsfiddle.net/0tsyc1sx/

如果您正在使用lodash.js,请使用_.difference

filteredArray = _.difference(array, anotherOne);

演示

如果您有一组对象:

var array = [{id :1, name :"test1"},{id :2, name :"test2"},{id :3, name :"test3"},{id :4, name :"test4"}];

var anotherOne = [{id :2, name :"test2"}, {id :4, name :"test4"}];

var filteredArray  = array.filter(function(array_el){
   return anotherOne.filter(function(anotherOne_el){
      return anotherOne_el.id == array_el.id;
   }).length == 0
});

演示对象数组

使用 lodash 演示 diff 对象数组

Hummm ......你只需要改变idanotherOne_el.id == array_el.id,不管你有钥匙在自己的对象。您应该了解有关 javascript 中的数组和对象的知识,这将有助于您更好地理解答案
2021-03-11 21:00:31
你在使用 lodash 吗?
2021-03-14 21:00:31
嗨,你能在对象数组中扩展这个吗?我将不胜感激
2021-04-03 21:00:31
好吧先生,它确实有效,但除了 id 之外,我如何用名称过滤其他方式?
2021-04-06 21:00:31
不,先生,我更喜欢遵循回调方法
2021-04-09 21:00:31

        /* Here's an example that uses (some) ES6 Javascript semantics to filter an object array by another object array. */

        // x = full dataset
        // y = filter dataset
        let x = [
            {"val": 1, "text": "a"},
            {"val": 2, "text": "b"},
            {"val": 3, "text": "c"},
            {"val": 4, "text": "d"},
            {"val": 5, "text": "e"}
            ],
            y = [
            {"val": 1, "text": "a"},
            {"val": 4, "text": "d"}               
            ];

        // Use map to get a simple array of "val" values. Ex: [1,4]
        let yFilter = y.map(itemY => { return itemY.val; });

        // Use filter and "not" includes to filter the full dataset by the filter dataset's val.
        let filteredX = x.filter(itemX => !yFilter.includes(itemX.val));

        // Print the result.
        console.log(filteredX);

@ChiragJain 让我知道什么令人困惑,我可以澄清!
2021-03-12 21:00:31
确实是一个明智而合乎逻辑的解决方案!
2021-03-17 21:00:31
我不确定这是如何工作的,但稍作调整就挽救了这一天。谢谢。如果有人可以解释这是如何工作的,那将非常有帮助
2021-03-25 21:00:31
正是我所需要的。谢谢
2021-04-05 21:00:31
2 问题: 1 您是否因为需要比较值而将对象数组映射到平面数组?2 是否可以使用 .some() 来做到这一点
2021-04-07 21:00:31

下面的代码是根据另一个数组过滤一个数组的最简单方法。两个数组都可以在其中包含对象而不是值。

let array1 = [1, 3, 47, 1, 6, 7];
let array2 = [3, 6];
let filteredArray1 = array1.filter(el => array2.includes(el));
console.log(filteredArray1); 

输出: [3, 6]

这不是过滤。输出是array2。为什么这个答案有 19 票赞成?没有意义。
2021-03-25 21:00:31