Przeglądaj źródła

use Set in deep traverse

Evan You 10 lat temu
rodzic
commit
e59b3017fe
1 zmienionych plików z 10 dodań i 6 usunięć
  1. 10 6
      src/watcher.js

+ 10 - 6
src/watcher.js

@@ -334,25 +334,29 @@ Watcher.prototype.teardown = function () {
  * @param {*} val
  * @param {*} val
  */
  */
 
 
-function traverse (val, walkedObjs) {
+const seenObjects = new Set()
+function traverse (val, seen) {
   var i, keys
   var i, keys
 
 
-  walkedObjs = walkedObjs || {}
+  if (!seen) {
+    seen = seenObjects
+    seen.clear()
+  }
   if (isArray(val)) {
   if (isArray(val)) {
     i = val.length
     i = val.length
-    while (i--) traverse(val[i], walkedObjs)
+    while (i--) traverse(val[i], seen)
   } else if (isObject(val)) {
   } else if (isObject(val)) {
     if (val.__ob__) {
     if (val.__ob__) {
       var depId = val.__ob__.dep.id
       var depId = val.__ob__.dep.id
-      if (walkedObjs[depId]) {
+      if (seen.has(depId)) {
         return
         return
       } else {
       } else {
-        walkedObjs[depId] = true
+        seen.add(depId)
       }
       }
     }
     }
 
 
     keys = Object.keys(val)
     keys = Object.keys(val)
     i = keys.length
     i = keys.length
-    while (i--) traverse(val[keys[i]], walkedObjs)
+    while (i--) traverse(val[keys[i]], seen)
   }
   }
 }
 }