mirror of https://github.com/vuejs/vue.git
fix array filtering perf regression (revert 30bd8be)
This commit is contained in:
parent
f46e516907
commit
d58a5b965b
|
|
@ -73,14 +73,17 @@ exports.orderBy = function (arr, sortKey, reverse) {
|
|||
*/
|
||||
|
||||
function contains (val, search) {
|
||||
var i
|
||||
if (_.isPlainObject(val)) {
|
||||
for (var key in val) {
|
||||
if (contains(val[key], search)) {
|
||||
var keys = Object.keys(val)
|
||||
i = keys.length
|
||||
while (i--) {
|
||||
if (contains(val[keys[i]], search)) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
} else if (_.isArray(val)) {
|
||||
var i = val.length
|
||||
i = val.length
|
||||
while (i--) {
|
||||
if (contains(val[i], search)) {
|
||||
return true
|
||||
|
|
|
|||
|
|
@ -1,4 +1,5 @@
|
|||
var _ = require('../util')
|
||||
var uid = 0
|
||||
|
||||
/**
|
||||
* A dep is an observable that can have multiple
|
||||
|
|
@ -8,6 +9,7 @@ var _ = require('../util')
|
|||
*/
|
||||
|
||||
function Dep () {
|
||||
this.id = uid++
|
||||
this.subs = []
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -37,8 +37,8 @@ function Watcher (vm, expOrFn, cb, options) {
|
|||
this.id = ++uid // uid for batching
|
||||
this.active = true
|
||||
this.dirty = this.lazy // for lazy watchers
|
||||
this.deps = []
|
||||
this.newDeps = []
|
||||
this.deps = Object.create(null)
|
||||
this.newDeps = null
|
||||
this.prevError = null // for async error stacks
|
||||
// parse expression for getter/setter
|
||||
if (isFn) {
|
||||
|
|
@ -64,15 +64,12 @@ function Watcher (vm, expOrFn, cb, options) {
|
|||
*/
|
||||
|
||||
Watcher.prototype.addDep = function (dep) {
|
||||
var newDeps = this.newDeps
|
||||
var old = this.deps
|
||||
if (_.indexOf(newDeps, dep) < 0) {
|
||||
newDeps.push(dep)
|
||||
var i = _.indexOf(old, dep)
|
||||
if (i < 0) {
|
||||
var id = dep.id
|
||||
if (!this.newDeps[id]) {
|
||||
this.newDeps[id] = dep
|
||||
if (!this.deps[id]) {
|
||||
this.deps[id] = dep
|
||||
dep.addSub(this)
|
||||
} else {
|
||||
old[i] = null
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -169,6 +166,7 @@ Watcher.prototype.set = function (value) {
|
|||
|
||||
Watcher.prototype.beforeGet = function () {
|
||||
Dep.target = this
|
||||
this.newDeps = Object.create(null)
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -177,17 +175,15 @@ Watcher.prototype.beforeGet = function () {
|
|||
|
||||
Watcher.prototype.afterGet = function () {
|
||||
Dep.target = null
|
||||
var oldDeps = this.deps
|
||||
var i = oldDeps.length
|
||||
var ids = Object.keys(this.deps)
|
||||
var i = ids.length
|
||||
while (i--) {
|
||||
var dep = oldDeps[i]
|
||||
if (dep) {
|
||||
dep.removeSub(this)
|
||||
var id = ids[i]
|
||||
if (!this.newDeps[id]) {
|
||||
this.deps[id].removeSub(this)
|
||||
}
|
||||
}
|
||||
this.deps = this.newDeps
|
||||
this.newDeps = oldDeps
|
||||
oldDeps.length = 0 // reuse old dep array
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -282,9 +278,10 @@ Watcher.prototype.evaluate = function () {
|
|||
*/
|
||||
|
||||
Watcher.prototype.depend = function () {
|
||||
var i = this.deps.length
|
||||
var depIds = Object.keys(this.deps)
|
||||
var i = depIds.length
|
||||
while (i--) {
|
||||
this.deps[i].depend()
|
||||
this.deps[depIds[i]].depend()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -300,9 +297,10 @@ Watcher.prototype.teardown = function () {
|
|||
if (!this.vm._isBeingDestroyed) {
|
||||
this.vm._watchers.$remove(this)
|
||||
}
|
||||
var i = this.deps.length
|
||||
var depIds = Object.keys(this.deps)
|
||||
var i = depIds.length
|
||||
while (i--) {
|
||||
this.deps[i].removeSub(this)
|
||||
this.deps[depIds[i]].removeSub(this)
|
||||
}
|
||||
this.active = false
|
||||
this.vm = this.cb = this.value = null
|
||||
|
|
|
|||
Loading…
Reference in New Issue