const a = [] for (i = 0; i < 100000; i++) { a.push({ id: i, name: 'xx' + i }) } const b = [] for (let i = 0; i < 100; i++) { b.push({ id: i, name: 'yy' + i }) } // 最慢的循環:n^2,最好把map放到外面用變量接收 const c = a.filter(n => b.map(m => m.id).includes(n.id)) // console.log(c) // 三種方法: // 第一種:2個forEach console.time('打印d') const d = [] b.forEach(n => { a.forEach(m => { if (n.id === m.id) d.push(n) }) }) console.log(d) console.timeEnd('打印d') // 把長的數據放在外面更快 console.time('打印d1') const d1 = [] a.forEach(n => { b.forEach(m => { if (n.id === m.id) d1.push(m) }) }) console.log(d1) console.timeEnd('打印d1') // 第二種:filter(ES5) + includes(ES7) console.time('打印e') const ids = a.map(m => m.id) const e = b.filter(n => ids.includes(n.id)) console.log(e) console.timeEnd('打印e') // 第三種:創建obj(兼容性好) console.time('打印f') let obj = {} b.forEach(n => (obj[n.id] = n.name)) console.log(obj) const f = a.filter(n => { n.name = obj[n.id] return obj[n.id] }) console.log(f) console.timeEnd('打印f')
結果:
總結:
1、不要在filter中寫map,這種的時間復雜度是 n^2,最慢
2、通過兩個forEach來遍歷時,時間復雜度為 n*2。把長的數據放在外面速度更快
3、filter + includes的方法除了兼容性問題,運行很快
4、通過創建一個obj的形式,時間復雜度為n,沒有兼容性問題