繁体   English   中英

比较和删除数组元素

[英]Compare and remove array elements

我在这段代码中有一个我似乎无法解决的错误。 如果只有 1 个 Act 实例,它会正常工作。 但是当Act的实例超过1个时,它就会中断。 不确定我在这里缺少什么。

//Find all instances of italics
var findItalics = new RegExp(/(<em>.*?<\/em>)/g);
var italicsArray = [];
var italicCount;

while (italicCount = findItalics.exec(searchInput)) {
    italicsArray.push(italicCount[0]);
}

//Find the italics containing the word 'Act'
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);
var keywordItalicArray = [];
var italicCountKeyword;

while (italicCountKeyword = keywordItalics.exec(italicsArray)) {
    keywordItalicArray.push(italicCountKeyword[0]);
}

//Remove all instances of the keyword(s)
for (var tlcs = italicsArray.length - 1; tlcs >= 0; tlcs--) {
    if(italicsArray[tlcs] == keywordItalicArray) {
        italicsArray.splice(tlcs, 1);
    }
}

感谢@artgb 帮助我重新思考这个问题。

//Find all instances of italics
var findItalics = new RegExp(/(<em>.*?<\/em>)/g);
var italicsArray = [];
var italicCount;

while (italicCount = findItalics.exec(searchInput)) {
    italicsArray.push(italicCount[0]);
}

//Find the italics containing the word 'Act'
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);
var keywordItalicArray = [];
var italicCountKeyword;

while (italicCountKeyword = keywordItalics.exec(searchInput)) {
    keywordItalicArray.push(italicCountKeyword[0]);
}

//Remove all instances of the keyword(s)
for(var xXx = 0; xXx < keywordItalicArray.length; xXx++){   
    for (var tlcs = italicsArray.length - 1; tlcs >= 0; tlcs--) {
        if(italicsArray[tlcs] == keywordItalicArray[xXx]) {
            italicsArray.splice(tlcs, 1);
        }
    }
}
var keywordItalics = new RegExp(/<em>.*?(Act).*?<\/em>/g);

通常应缩短为:

var keywordItalics = /<em>.*?(Act).*?<\/em>/g;

您的 () 在哪里,这只会捕获“Act”,因此要捕获 em 中的整个字符串,它应该是:

var keywordItalics = /<em>(.*?Act.*?)<\/em>/g;

但是,一种更快的方法(没有正则表达式)您可以通过以下方式获得所有强调标签的数组:

var keywordItalics = document.getElementsByTagName('em');

如果您只是想摆脱所有包含“Act”的 em,您只需要:

   document.body.innerHTML = document.body.innerHTML.replace(
     /<em>.*?Act.*?<\/em>/g,
     ''
   );

这应该删除文档中包含“Act”的所有 em 痕迹(有效地用空字符串替换这些字符串,也就是什么都没有)。 但是,它会导致回流。 如果它们在 body 之外的包含元素内,最好先获取包含元素(而不是使用 body)。 有“更好”的方法可以做到这一点,但这可能是最简单的编码方式。

更新:从数组中删除带有“Act”的 em 的简单方法是:

italicsArray = italicsArray
  .join('_SEP_')  // Convert to string
  .replace(/<em>.*?Act.*?<\/em>/g,'')  // Delete matched entries
  .replace(/(_SEP_)+/g,'_SEP_')  // Collapse multiple seperators 
  .split('_SEP_')  // Convert back to array 
;

这基本上使用了一个分隔符_SEP_ (以避免与包含 ',' 的字符串发生冲突)并将数组转换为字符串,删除与正则表达式的所有匹配项,删除将成为未定义条目的内容,并以相同的名称重新创建数组。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM