过滤掉满是对象的数组?

时间:2017-08-15 14:47:07

标签: javascript arrays object filter

在下面的代码中,我能够比较2个数组并过滤掉第一个数组中不包含的元素。

const a = [1,2,3,4,5];
const b = [1,3]

const elements_in_a_not_in_b = a.filter((element) => !b.includes(element))

console.log(
  elements_in_a_not_in_b
)

但是现在我想为只包含对象的数组解决这个问题。如何做到这一点?

const a = [Object,Object,Object,Object,Object];
const b = [Object,Object]

1 个答案:

答案 0 :(得分:1)

你想遍历a中的每个元素并检查b上是否有任何匹配,如果没有,则将其添加到输出中。

function getElementsInANotInB(a,b){
    var results = []
    for(var i=0;i<a.length;i++){
        var in_b = false
        // check if any element in b matches a[i]
        for(var u=0;u<b.length;u++){
            if(compareObjects(a[i],b[u])){ 
                in_b = true
                break
            }
        }
        if(!in_b) // no element in b matched a[i], add to results
            results.push(a[i])
    }
    return results
}

function compareObjects(obj1,obj2,reversed){
    // search for differences recursively
    for(var key in obj1){
        if(typeof obj2[key]=="undefined") return false
        if(typeof obj1[key] == "object"){
            if(!compareObjects(obj1[key],obj2[key])) return false
        }
        else if(obj1[key]!=obj2[key]) return false
    }
    return reversed ? true : compareObjects(obj2,obj1,true)
}

调用getElementsInANotInB(a,b)应该会为您提供所需的数组,其中包含a中不包含b的所有元素。