需求: 把请求回来的数据跟现有数据作对比, 如果管理号 (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
收藏 0
分享 1
回答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