diff --git a/src/global/formula.js b/src/global/formula.js index 3045ada4e..cae81cdeb 100644 --- a/src/global/formula.js +++ b/src/global/formula.js @@ -5005,21 +5005,21 @@ const luckysheetformula = { } //把修改涉及的单元格存储为对象 - let updateValueOject = {}, updateValueArray = []; + let updateValueOjects = {}, updateValueArray = []; if (_this.execFunctionExist == null) { let key = "r" + origin_r + "c" + origin_c + "i" + index; - updateValueOject[key] = 1; + updateValueOjects[key] = 1; } else{ for (let x = 0; x < _this.execFunctionExist.length; x++) { let cell = _this.execFunctionExist[x]; let key = "r" + cell.r + "c" + cell.c + "i" + cell.i; - updateValueOject[key] = 1; + updateValueOjects[key] = 1; } } let arrayMatchCache = {}; - let arrayMatch = function(formulaArray, formulaObjects, func){ + let arrayMatch = function(formulaArray, formulaObjects, updateValueOjects, func){ for(let a=0;a{ + let formulaObject = formulaObjects[key]; + arrayMatch(formulaObject.formulaArray, formulaObjects, updateValueOjects, function(childKey){ + if(childKey in formulaObjects){ + let childFormulaObject = formulaObjects[childKey]; + formulaObject.chidren[childKey] = 1; + childFormulaObject.parents[key] = 1; + } + // console.log(childKey,formulaObject.formulaArray); + if(childKey in updateValueOjects){ + updateValueArray.push(formulaObject); + } + }); + }); + + // console.log(formulaObjects) + // console.timeEnd("2"); + + + // console.time("3"); let formulaRunList = []; - //计算 + //计算,采用深度优先遍历公式形成的图结构 + + // updateValueArray.forEach((key)=>{ + // let formulaObject = formulaObjects[key]; + + + // }); let stack = updateValueArray, existsFormulaRunList={}; while(stack.length>0){ @@ -5140,14 +5170,21 @@ const luckysheetformula = { continue; } + if(formulaObject.color == "b"){ + formulaRunList.push(formulaObject); + existsFormulaRunList[formulaObject.key] = 1; + continue; + } + let cacheStack = []; - arrayMatch(formulaObject.formulaArray, formulaObjects,function(childKey){ - if(childKey in formulaObjects && !(childKey in existsFormulaRunList)){ - let childFormulaObject = formulaObjects[childKey]; - cacheStack.push(childFormulaObject); + Object.keys(formulaObject.parents).forEach((parentKey)=>{ + let parentFormulaObject = formulaObjects[parentKey]; + if(parentFormulaObject!=null){ + cacheStack.push(parentFormulaObject); } }); + ii++; if(cacheStack.length==0){ @@ -5155,15 +5192,18 @@ const luckysheetformula = { existsFormulaRunList[formulaObject.key] = 1; } else{ + formulaObject.color = "b"; stack.push(formulaObject); stack = stack.concat(cacheStack); } } + formulaRunList.reverse(); + // console.log(formulaObjects, ii) - // console.timeEnd("2"); + // console.timeEnd("3"); - // console.time("3"); + // console.time("4"); for(let i=0;i