js 判断两个数组对象里某一字段是否相等, 想找一些更优秀的写法

需求: 把请求回来的数据跟现有数据作对比, 如果管理号 (managerNo) 一样则把请求回来数据里的某一字段作高亮处理。
//原有数据:
let parent = [
    { name: aa, managerNo: 11},
    { name: bb, managerNo: 12},
    { name: cc, managerNo: 13},
    ...
]

//请求回来的数据:
let child = [
    { name: dd, managerNo: 11},
    { name: ee, managerNo: 15},
    { name: ff, managerNo: 16},
    ...
]

现操作:

for(let item1 of parent) {
    for(let item2 of child) {
        if(item1.managerNo == item2.managerNo) {
            item2._checked = true;
        }
    }
}

如果两个数组过长的话我觉得会很耗性能。
期待更优秀的写法, 或者更骚的写法。
好人一生平安 ~

阅读 8.4k
6 个回答

这个怎么说,你的写法时间复杂度是O(m x n).、
类似的问题应该都是先用一个数组建立索引,再遍历另一个数组,时间复杂度是O(m+n)
具体操作:

// 建立映射
let map = parent.reduce((r, o) => (r[o.managerNo] = true, r), {})
// 处理高亮
child.forEach(o => map[o.managerNo] && o._checked = true)

两行代码,时间复杂度低很多。

const matchArr = parent.map(obj => obj.managerNo)
const newArr = child.map(obj => {
    obj._checked = matchArr.indexOf(obj.managerNo) >= 0
    return obj
})

也没优化个啥,看看别人的

每每遇到这类问题,第一反应都是空间换时间。

const no = parent.reduce((res, v) => (res.add(v.managerNo), res),new Set())
const same = child.reduce((res, v) => { 
    if(no.has(v.managerNo)) res.push(v); 
    return res; 
},[]);

方法一 find:
const result = child.map(item => parent.find(item1 => item1.managerNo == item.managerNo)?{...item, _checked:true}:item)

方法2some
const result = child.map(item => parent.some(item1 => item1.managerNo == item.managerNo)?{...item, _checked:true}:item)

别找了,两个数组比较只能遍历,都是引用类型,存的都是地址,不遍历把值拿出来看看怎么比;
论速度当然是for循环是最快了,其他的方法都慢的多的多,就是看着流弊一些,数据少的时候差别不大,1毫秒和5毫秒没啥感觉,数据多了for的优势就比较明显了;

把请求回来的数据JSON一下,然后遍历parent用正则判断是否一致

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