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;
        }
    }
}

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

已解决 悬赏分:30 - 解决时间 2021-11-28 10:54
反对 0举报 0 收藏 0

回答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)

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

    支持 0 反对 0 举报
    2021-11-28 04:52
  • @
    const matchArr = parent.map(obj => obj.managerNo)
    const newArr = child.map(obj => {
        obj._checked = matchArr.indexOf(obj.managerNo) >= 0
        return obj
    })

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

    支持 0 反对 0 举报
    2021-11-28 06:11
  • @

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

    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; 
    },[]);
    支持 0 反对 0 举报
    2021-11-28 07:32
  • @

    方法一 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)

    支持 0 反对 0 举报
    2021-11-28 08:42
  • @

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

    支持 0 反对 0 举报
    2021-11-28 09:30
  • @

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

    支持 0 反对 0 举报
    2021-11-28 10:14