JavaScript 将搜索匹配存储在数组中

Posted

技术标签:

【中文标题】JavaScript 将搜索匹配存储在数组中【英文标题】:JavaScript storing search matches in array 【发布时间】:2015-09-15 13:53:44 【问题描述】:

如何将id="post_body"中的搜索匹配存储到数组中?

<textarea name="post[body]" id="post_body">

--Lorem ipsum-- dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et --Dolore-- magna aliqua。 Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat。 --Duis aute-- irure dolor in reprehenderit in voluptate velit esse cillum --Dolore-- eu fugiat nulla pariatur

&lt;/textarea&gt;

目标是所有被'--'包围的单词。在 Ruby 中,我这样做是:

matches = tex.scan(/--(.+?)--/).flatten
matches = matches.uniq

在这种情况下,数组将是:

matches = ["Lorem ipsum", "Dolore", "Duis aute"];

注意:单词“Dolore”出现了两次,被 -- 包围,但在数组中它应该只存储一次。

【问题讨论】:

您从document.getElementById('post_body').value.match(/--(.+?)--/) 开始,然后将其缩减以获得唯一值。 "如何将 id="post_body" 中的搜索匹配存储到数组中?" 1. 研究。 2. 实验。 3. 尝试。 (4. 如有必要, 1-3 之后:发布一个显示尝试使用MCVE 的问题,描述您期望它做什么,它正在做什么,并询问原因。) 【参考方案1】:

    var text = document.getElementById('post_body').value;
    var res = text.match(/--\w+\s*\w*--/g);

     //remove duplicates
    uniqueArray = res.filter(function(item, pos, self) 
      return self.indexOf(item) == pos;
    );

     //remove "--" parts
    finalArray = uniqueArray.map(function(item) 
      return item.replace(/--/g,"");
    );

    alert(finalArray);
&lt;textarea name="post[body]" id="post_body"&gt;--Lorem ipsum-- dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et --Dolore-- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. --Duis aute-- irure dolor in reprehenderit in voluptate velit esse cillum --Dolore-- eu fugiat nulla pariatur&lt;/textarea&gt;

【讨论】:

非常感谢!它是如此干净和说明性! 是的,当分隔符大小相等时,它适用于这种情况。但是,它可以很容易地适应其他场景。【参考方案2】:

您可以使用以下代码:

function contains(a, obj) 
    var i = a.length;
    while (i--) 
       if (a[i] === obj) 
           return true;
       
    
    return false;


var re = /--\s*(.*?)\s*--/g; 
var str = '--Lorem ipsum-- dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et --Dolore-- magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. --Duis aute-- irure dolor in reprehenderit in voluptate velit esse cillum --Dolore-- eu fugiat nulla pariatur';
var arr = [];
while ((m = re.exec(str)) !== null) 
    if (!contains(arr, m[1]))
     
        arr.push(m[1]);
    
 
alert(arr);

正则表达式将匹配 -- 中包含的文本,并将第一个捕获组文本放入数组 arr 中,前提是该值不存在于数组中(contains 函数取自 this SO post) .

至于正则表达式,\s* 添加到 --\s*(.*?)\s*-- 将修剪里面的值。如果您不需要修剪,请删除这些 \s*s。

【讨论】:

非常感谢!我从 javascript 开始,你的回答帮助我理解它是如何工作的。我一直在学习。 很高兴你喜欢它。这只是另一种方法:我不是执行后期处理,而是执行排除它的逻辑步骤(1.获取捕获的文本,2.检查文本是否已经在数组中。3.添加字符串如果在数组中找不到,则找到数组。)如果您发现我的回答有帮助,请考虑对其进行投票(左侧的向上箭头)。

以上是关于JavaScript 将搜索匹配存储在数组中的主要内容,如果未能解决你的问题,请参考以下文章

将选择结果存储在数组中

javascript - 在对象数组中,返回任何值与特定字符串匹配的对象

映射两个对象数组,匹配属性并将特定信息存储在新数组中

Javascript 性能:为啥遍历数组并检查每个值比 indexOf、搜索和匹配更快?

使用 JavaScript 在 JSON 中搜索精确匹配

使用 Jquery Each 在 Javascript 对象和数组中查找匹配项