前端两个数组怎么匹配?

现在知道一个数组a和b,想根据a数组的值为id把b对应的数据都拿出来弄个新数组如下,改怎么操作简便点

[
    {id:"110",name:"警察"},
    {id:"150",name:"医生"},
    {id:"190",name:"警察"}
]
var a = [110,150,190];
var b = [
    {id:"110",name:"警察"},
    {id:"120",name:"医生"},
    {id:"130",name:"警察"},
    {id:"140",name:"警察"},
    {id:"150",name:"医生"},
    {id:"160",name:"警察"},
    {id:"170",name:"警察"},
    {id:"180",name:"医生"},
    {id:"190",name:"警察"},
];
阅读 2.3k
3 个回答
// 数据量不大,直接双重循环查找即可(复杂度O(n*m))
b.filter(v => a.some(id => v.id == id))
// 数据量较大时,将id转为set/map/object以提升查询速度(复杂度O(n),空间复杂度O(m))
var ids = new Set(a);
b.filter(v => ids.has(+v.id)) // 因为set里string/number是不同值,需要统一类型

for 循环不会吗?

var a = [110,150,190];
var b = [
    {id:"110",name:"警察"},
    {id:"120",name:"医生"},
    {id:"130",name:"警察"},
    {id:"140",name:"警察"},
    {id:"150",name:"医生"},
    {id:"160",name:"警察"},
    {id:"170",name:"警察"},
    {id:"180",name:"医生"},
    {id:"190",name:"警察"},
];
let result = [];
for(let i = 0; i < b.length; i++) {
    const id = b[i].id;
    if(a.findIndex(i => i === Number(id)) > -1) {
        result.push(b[i]);
    }
}

// 再简洁一点,用 filter 方法
const result = b.filter(item => a.findIndex(i => i === Number(item.id)) > -1);

filter findIndex 都是数组的方法,可以搜索看一下具体用法。

简单点就是

let result = a.map(id => b.find(r => r.id == id))

减少循环次数

let bMap = {}

b.forEach(item => {
  bMap[item.id] = item
})

let result = a.map(id => bMap[id])

或者更少

let bMap = {}

let result = a.map(id => {
  if (bMap[id] !== undefined) {
    return bMap[id]
  }

  return b.find(r => {
    if (bMap[r.id] === undefined) {
      bMap[r.id] = r
    }

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