Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript编辑文本文件-删除除一行以外的所有空行_Javascript_Arrays - Fatal编程技术网

Javascript编辑文本文件-删除除一行以外的所有空行

Javascript编辑文本文件-删除除一行以外的所有空行,javascript,arrays,Javascript,Arrays,我刚开始学习Javascript,我正试图实现一个我脑海中浮现的项目。该项目是一个简单的文本编辑器,它将文本作为输入,进行一些更正,并使用固定文本发布输出 输入文本作为数组导入。文本的每一行都是对象属性。inputText用于在div内的浏览器中显示默认文本,outputText是我用于编辑的文本 inputText = loadStrings("v.txt"); outputText = inputText; 现在输入的文本有一些句子。问题是中间有很多空行 我想要实现的是删除所有空行,但只有

我刚开始学习Javascript,我正试图实现一个我脑海中浮现的项目。该项目是一个简单的文本编辑器,它将文本作为输入,进行一些更正,并使用固定文本发布输出

输入文本作为数组导入。文本的每一行都是对象属性。inputText用于在div内的浏览器中显示默认文本,outputText是我用于编辑的文本

inputText = loadStrings("v.txt");
outputText = inputText;
现在输入的文本有一些句子。问题是中间有很多空行

我想要实现的是删除所有空行,但只有一行,因此输出文本如下所示:

我正在寻找一个解决方案几乎3天了。我已经设法删除了所有的空行,但这不是我想要的。如果有多个空行,我想删除它们,但是如果只有一个空行,就不要做任何更改

这段代码是我尝试过的许多代码之一。这将删除所有空行:

(来源:)

这是我正在使用的所有HTML、CSS和JS代码的代码笔。 试试:

outputText = outputText.filter(function(e){
    return e.replace(/[\r\n]+/g, '\n\n')});
我不确定上面的过滤功能。但尝试以下一个必须工作

outputText = outputText.replace(/[\r\n]+/g, '\n\n');
更换两条新线路是最简单的方法。你会得到你想要的。

试试这个正则表达式:

e.replace(/([\r\n]){2,}/g, '\n\n')});
这将仅匹配两个或多个连续的空行,并替换为空行

我的测试代码:

var lines = 'firstLine\n\n\n\nsecodLine\n\n\n\n\n\n\nthirdLine';
/*
firstLine



secondLine






thirdLine
*/
console.log(lines.replace(/([\r\n]){2,}/g, '\n\n'));

/*
firstLine

secodLine

thirdLine
*/

我不知道
loadStrings
是否在行尾留下换行符。我假设是这样(基于我在本页看到的一些代码)。如果它最后被弄坏了,请说出来

像赫利奥·马尔西奥·费略所说的那样,在一根弦上做这件事肯定更容易。因此,在您的情况下,从一个数组开始,您可以将数组连接在一起,用两个换行符替换三个或更多的换行符,然后将其拆分为多行:

let outputText = inputText.join('').replace(/(?:\r?\n){3,}/g, '\n\n').
  split(/\n/).map(line => line + "\n");
但是,您也可以使用
过滤器
-您只需要知道刚才看到了多少空行,并抑制多余的空行:

let empties = 0;
let outputText = inputText.filter(line => {
  if (line.replace(/[\r\n]+/, '')) empties = 0;
  else empties++;
  return empties <= 1;
});
let清空=0;
让outputText=inputText.filter(行=>{
如果(换行符(/[\r\n]+/,'')为空=0;
否则清空++;

return清空其他答案使用单个字符串,但您使用的是Processing.js中的
loadStrings()
函数,它为您提供了一个字符串数组

您可以将数组转换为单个字符串,或将文件作为单个字符串加载,但如果您只处理数组,这对我来说似乎是最简单的。如下所示:

function reduceNewlines(inputArray){

  var outputNewArray = [];
  var previousLineWasNewline = false;

  for(var i = 0; i < myArray.length; i++){
    if(myArray[i] == ''){
      if(!previousLineWasNewline){
        outputArray.push('');
      }
      previousLineWasNewline = true;
    }
    else{
      outputArray.push(myArray[i]);
      previousLineWasNewline = true;
    }
  }
  return outputArray;
}
函数还原线(输入阵列){
var outputNewArray=[];
var previousLineWasNewline=false;
对于(var i=0;i
请注意,我还没有测试这段代码,可能还有很多改进的余地。但总体思路是:您可以编写一个函数来处理数组并返回一个新数组,同时删除连续的换行符


你也可以考虑预处理你的文本文件,这样你就不必这样做了。

首先,我要感谢大家的帮助。我研究了你所有的回复,我已经测试了其中的每一个,它们都在工作(有些需要调整)。作为独立的代码,但当我将它们插入到代码中时,有些地方出了问题。因此,我挣扎着提出了自己的解决方案,您的评论极大地激发了我的灵感

因此,在我的案例中起作用的代码是:

function reduceNewlines(outputTextEditNewLines) {

  for (let key = 0; key < outputTextEditNewLines.length; key++) {
    if (outputTextEditNewLines[key] == '') outputTextEditNewLines[key] = '\n';
    else outputTextEditNewLines[key] = outputTextEditNewLines[key];
  }

  arrayToString = outputTextEditNewLines.join(""); // convert object myArray to string
  console.log(arrayToString.replace(/([\r\n]){1,}/g, '\n\n')); // exports the text as it should

  return arrayToString.replace(/([\r\n]){1,}/g, '\n\n');

}
函数reduceNewlines(outputExtEditNewlines){
for(让key=0;key

console.log按原样导出文本。现在,我的项目的下一步是让这个字符串在console.log中打印时打印到DOM。

为了澄清,
inputText
是数组还是字符串?inputText是一个对象。如果没有关于所述对象结构的更多信息,就不可能给您一个answer@Amadan我已经用一个包含我所有代码的代码笔更新了原始帖子。它位于原始帖子的最后一行。它根本没有帮助,因为
loadStrings
是未定义的,所以在代码中我看不到关于
inputText
是什么的指示。
。filter
只对数组有效,对任何其他类型都无效这是他想要的。看他的问题。我已经试过了。无论我在正则表达式字段的第二部分放什么,都不会有什么区别。我试过用\n\n替换\n,只留下一些空引号,甚至试着放一些字符串值,看看它是否有区别。它没有。它是我会有所不同。我尝试并发布了答案。更新的答案。使用时不使用过滤功能。必须有效。@Sindhoor我尝试了你建议的更新单行代码,但我得到一个错误:
index.js:80未捕获(承诺中)TypeError:outputText.replace不是removeEmptyLines的函数
我只尝试了你的代码,它确实可以工作。但在我的代码中,我必须使用对象或数组(实际上我现在对它是什么感到困惑)。如果我将文件加载为一个字符串,而不是对象或数组,那么您的解决方案可能会起作用?您可以使用array.reduce()将行数组转换为包含所有行的单个字符串,然后再应用该字符串
let empties = 0;
let outputText = inputText.filter(line => {
  if (line.replace(/[\r\n]+/, '')) empties = 0;
  else empties++;
  return empties <= 1;
});
function reduceNewlines(inputArray){

  var outputNewArray = [];
  var previousLineWasNewline = false;

  for(var i = 0; i < myArray.length; i++){
    if(myArray[i] == ''){
      if(!previousLineWasNewline){
        outputArray.push('');
      }
      previousLineWasNewline = true;
    }
    else{
      outputArray.push(myArray[i]);
      previousLineWasNewline = true;
    }
  }
  return outputArray;
}
function reduceNewlines(outputTextEditNewLines) {

  for (let key = 0; key < outputTextEditNewLines.length; key++) {
    if (outputTextEditNewLines[key] == '') outputTextEditNewLines[key] = '\n';
    else outputTextEditNewLines[key] = outputTextEditNewLines[key];
  }

  arrayToString = outputTextEditNewLines.join(""); // convert object myArray to string
  console.log(arrayToString.replace(/([\r\n]){1,}/g, '\n\n')); // exports the text as it should

  return arrayToString.replace(/([\r\n]){1,}/g, '\n\n');

}