1

我试图在 JavaScript 中创建一个函数以进行练习,但以下代码似乎没有正确执行或在浏览器中没有按预期执行。浏览器只是一直显示忙碌的标志,而计算机实际上是挂起的。任何人都可以帮我解决thius 代码或问题所在:

function recluse() {
  return " It is\ncalled Data.\n\nData is made of merely bits, yet it takes complex forms. Control\nconsists only of simple instructions, yet it performs difficult\ntasks. From the small and trivial, the large and complex arise.\n\nThe program source is Data. Control arises from it. The Control\nproceeds to create new Data. The one is born from the other, the\nother is useless without the one. This is the harmonious cycle of\nData and Control.\n\nOf themselves, Data and Control are without structure. The programmers\nof old moulded their programs out of this raw substance. Over time,\nthe amorphous Data has crystallised into data types, and the chaotic\nControl was restricted into control structures and functions.\n\n%% Short Sayings\n\nWhen a student asked Fu-Tzu about the nature of the cycle of Data and\nControl, Fu-Tzu replied 'Think of a compiler, compiling itself.'\n\nA student asked 'The programmers of old used only simple machines and\nno programming languages, yet they made beautiful programs. Why do we\nuse complicated machines and programming languages?'. Fu-Tzu replied\n'The builders of old used only sticks and clay, yet they made\nbeautiful huts.'\n\nA hermit spent ten years writing a program. 'My program can compute\nthe motion of the stars on a 286-computer running MS DOS', he proudly\nannounced. 'Nobody own a 286-computer or uses MS DOS anymore.', Fu-Tzu\nresponded.\n\nFu-Tzu had written a small program that was full of global state and\ndubious shortcuts. Reading it, a student asked 'You warned us against\nthese techniques, yet I find them in your program. How can this be?'\nFu-Tzu said 'There is no need to fetch water hose when the house is\nnot on fire.'{This is not to be read as an encouragement of sloppy\nprogramming, but rather as a warning against neurotic adherence to\nrules of thumb.}\n\n%% Wisdom\n\nA student was complaining about digital numbers. 'When I take the root\nof two and then square it again, the result is already inaccurate!'.\nOverhearing him, Fu-Tzu laughed. 'Here is a sheet of paper. Write down\nthe precise value of the square root of two for me.'\n\nFu-Tzu said 'When you cut against the grain of the wood, much strength\nis needed. When you program against the grain of a problem, much code\nis needed.'\n\nTzu-li and Tzu-ssu were boasting about the size of their latest\nprograms. 'Two-hundred thousand lines', said Tzu-li, 'not counting\ncomments!'. 'Psah', said Tzu-ssu, 'mine is almost a *million* lines\nalready.' Fu-Tzu said 'My best program has five hundred lines.'\nHearing this, Tzu-li and Tzu-ssu were enlightened.\n\nA student had been sitting motionless behind his computer for hours,\nfrowning darkly. He was trying to write a beautiful solution to a\ndifficult problem, but could not find the right approach. Fu-Tzu hit\nhim on the back of his head and shouted '*Type something!*' The student\nstarted writing an ugly solution. After he had finished, he suddenly\nunderstood the beautiful solution.\n\n%% Progression\n\nA beginning programmer writes his programs like an ant builds her\nhill, one piece at a time, without thought for the bigger structure.\nHis programs will be like loose sand. They may stand for a while, but\ngrowing too big they fall apart{Referring to the danger of internal\ninconsistency and duplicated structure in unorganised code.}.\n\nRealising this problem, the programmer will start to spend a lot of\ntime thinking about structure. His programs will be rigidly\nstructured";
}

var para=recluse().split("\n\n");
function reduce(func,length,array)
{
    array.forEach(function(c)
                           {
                               length=func(length,c);
                           });
    return length;
}

<!---TOP LEVEL FUNCTION FOR PROCESSING A VALUE WITH A FUNCTION AND CREATING  AN ARRAY OF TH RESULTS------------>

function map(func,array)
{
    var result_array=[];

    array.forEach(function(c)
                           {
                               result_array.push(func(c));
                           });
   return result_array;
}

<!-------------THE ALGORITHM FOR FINDING THE EMPHASISED TEXT AND THE FOOTNOTES WITHIN THE TEXT---->

function fragmenter(text)
{
                var fragments=[];

                function indexing(char)
                {
                    var index=text.indexOf(char);
                    if(index==-1)
                    {
                        return text.length;
                    }
                    else
                    return index;
                }

                function ifAtStart(char)
                {
                    var end=(char,1);
                       if(end==-1)
                       {
                           throw Error("No enclosing "+char);
                       }
                    var part=text.slice(1,end);
                    text=text.slice(end+1);
                    return part;
                }

                function normalText(text)
                {
                    var end=reduce(Math.min,text.length,map(indexing,["*","{"]));//to check that the index is within the text only
                    var part=text.slice(0,end);
                    var text=text.slice(end);
                    return part;
                }

                while(text!="")        <!---4------> 
                {
                    if(text.charAt(0)=="*")
                    {
                        fragments.push({type:"emphasised",
                                       content:isAtFirst("*")});
                    }
                    else if(text.charAt(0)=="{")
                    {
                        fragments.push({type:"footnotes",
                                       content:isAtFirst("}")});
                    }
                    else
                    {
                        fragments.push({type:"Normal",
                                       content:normalText(text)});
                    }
                }
return fragments;               
}

console.log(fragmenter(para[1]));
4

1 回答 1

6

那里 :

while(text!="")
{
     // some code that doesn't change "text"
}

循环中的文本无法更改,因此您的代码无法完成。

如果您尝试遍历字符,您可以这样做:

for (var i=0; i<text.length; i++) {
     if (text.charAt(i)=="*")

但是我想知道您是否错过了这样一个事实,即当您调用 时normalText(text),该normalText函数无法更改它拥有的变量,而只能更改它自己的变量。您必须共享文本。一个解决方案是这样的:

 function normalText() // REMOVED text SO IT USES THE ONE OF THE ENCLOSING SCOPE
            {
                var end=reduce(Math.min,text.length,map(indexing,["*","{"]));//to check that the index is within the text only
                var part=text.slice(0,end);
                var text=text.slice(end);
                return part;
            }

 while(text!="")        
            {
                if(text.charAt(0)=="*")
                {
                    fragments.push({type:"emphasised",
                                   content:isAtFirst("*")});
                }
                else if(text.charAt(0)=="{")
                {
                    fragments.push({type:"footnotes",
                                   content:isAtFirst("}")});
                }
                else
                {
                    fragments.push({type:"Normal",
                       content:normalText()}); // REMOVED PASSING TEXT
                }
            }
于 2012-10-06T18:35:14.923 回答