数组循环去掉不同的元素,求指教?

var a1 = [{path:'home'},{path:'index'}]
var a2 =[{path:'home'},{path:'index'},{path:'delpage'}]

两个数组循环,删除不同的对象元素
期望a2 = [{path:'home'},{path:'index'}]

阅读 3.7k
6 个回答
var a1 = [{path:'home'},{path:'index'}]
var a2 =[{path:'home'},{path:'index'},{path:'delpage'}]

// 对比数组
function fun(arr1, arr2) {
    for (let i = 0; i < arr2.length; i += 1) {
        for(let j = 0; j < arr1.length; j += 1) {
            // 由于对象不能直接比较,可以先转换成字符串,再对比
            if (JSON.stringify(arr2[i]) === JSON.stringify(arr1[j])) {
                arr2.splice(i, 1)
            }
        }
    }
    return arr2
}

console.log(fun(a1, a2))

@tenggouwa 的解法虽然可行,但是效率不高,为n^2,我对javascript不熟,这里只提供思路,可以先对两个数组分别进行排序,排序算法有很多比n^2效率高的,排序完之后对两个数组遍历一遍即可(复杂度为n),所以两个加起来的复杂度是小于n^2的,尤其是n很大的时候。遍历的策略大致是两个指针分别指向排完序的数组的起始位置,然后比较,如果相等,则结果添加此元素,如果不等,则移动其中排序靠前的指针(也就是解引用后值较小的,如果按照从小到大排序的话),如此遍历即可。代码你可以自己实现,应该不复杂。

maybe,这样可以满足你的需求么

function getSameElement(a1, a2) {
  if(a1.length < a2.length) {
    [a1, a2] = [a2, a1];
  }
  return a2.filter(item => JSON.stringify(a1).includes(JSON.stringify(item)));
}
[...a1,...a2].reduce((obj,v)=>{
    let key=JSON.stringify(v);
    if(obj.check.includes(key)){
        obj.result.push(v)
    }else{
        obj.check.push(key);
    }
    return obj;
},{result:[],check:[]}).result
function filterArr(arr1,arr2) {
            return arr2.filter(v => {
                return a1.some(i => {
                    return v.path == i.path
                })
            })
        }
        console.log(filterArr(a1,a2)) //[{path:'home'},{path:'index'}]
新手上路,请多包涵

你的题目很怪
就这个题目而言,直接比较a1和a2的长度就可以拿到答案,a2=a1即可

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题