js數組循環的時間復雜度


      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,沒有兼容性問題

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM