最效率获得俩个数组的相同值

岛风风
  • 432

let arr1=['a','b','c','d','e']
let arr2=['c','d','g','h','a']
找到arr1和arr2中相同的值,并在arr2中删除对应的值
怎么写才更简单效率,我只能想到套个双层循环,就比如这样


    arr1.forEach((val)=>{
        arr2.forEach((v,i)=>{
            val === v &&  arr2.splice(i,1)
        })
    })

然后现在问题变了
arr2=[{'id':'c'},{'id':'d'},{'id':'g'},{'id':'h'},{'id':'a'}]
我的只要改一个地方就能继续运行

arr1.forEach((val)=>{
    arr2.forEach((v,i)=>{
        val === v.id &&  arr2.splice(i,1)
    })
})

你们代码需要怎么改才能实现原来的目的,改动最少最简单的,我认为是最合理的就采纳了

回复
阅读 960
6 个回答
let arr1=['a','b','c','d','e']
let arr2=['c','d','g','h','a']
let res = []
var a = arr2.filter(v => {
    if (arr1.indexOf(v) >= 0) {
        res.push(v)
    }
    return arr1.indexOf(v) < 0
})


res // ["c", "d", "a"]
a // ["g", "h"]

array 转 dict

let arr1=['a','b','c','d','e']
let arr2=['c','d','g','h','a']

let obj = arr1.reduce((iter, val) => {
    iter[val] = true
    return iter
}, {})
let result = arr2.filter(v => !obj[v])

console.log(result)
arr2 = arr2.filter((n) => !(arr1.findIndex((m) => m == n.id) > -1))

//加个id就行

arr1.forEach(function(val){console.log(arr2.indexOf(val))})

这个并不是完美解决方式,如果有一对多的情况不行

lodash 大法

_.difference([1,2,4],[2])

先将arr1放到map中,key=arr1[i],value=true
然后循环arr2,map中有就删除。

你知道吗?

宣传栏