首页 > 解决方案 > JavaScript 使用 map 来根据 '\n' 之类的字符划分字符串数组

问题描述

我正在使用地图来尝试清理发送到具有句子解析器的 API 的数据,该问题在找到 \n 或 \t 时确实会中断,因此选择暂时替换:

const allBulletPoints = Array.from(document.querySelectorAll('ul,ol'));
const allBulletPointsText = allBulletPoints.map((element) =>
    element.textContent
        .split(/(\t)|(\n)/g)
        .filter((element) => element && !element.match(/(\t)|(\n)/gi))
);

console.log(allBulletPointsText);
/*
Result:
[   
    [
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "    "
    ],
    [
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "        Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
        "    "
    ]
]

I need to be like this:
[
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
    "Lorem ipsum dolor sit amet consectetur, adipisicing elit", 
]
*/
<ul>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
</ul>
<ol>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
    <li>Lorem ipsum dolor sit amet consectetur, adipisicing elit</li>
</ol>

但是现在我想使用 substr 或 split 做一些更干净的事情,然后将所有元素分开添加并添加到同一个数组中。

知道如何使用此功能获得更好的解决方案吗?

标签: javascriptarrays

解决方案


  1. element.match(/(\t)|(\n)/gi)没有做任何事情,因为已经split删除了所有\t\n
  2. 您可以将其构建到拆分中,而不是单独修剪split(/\s*?[\t\n]\s*/g)每一行。或者只是使用match来匹配您感兴趣的内容。
  3. 连接数组可以用Array#flat().

所以这可能是你正在寻找的:

const allBulletPointsText = Array.from(
       document.querySelectorAll('ul,ol'),
       e => e.textContent.match(/\S[^\t\n]*\S|\S/g) || []
// or: e => e.textContent.trim().split(/\s*?[\t\n]\s*/g).filter(e => e)
// or: e => e.textContent.split(/^\s+|\s*?[\t\n]\s*|\s+$/g).filter(e => e)
// or: e => e.textContent.split(/[\t\n]+/g).map(e => e.trim()).filter(e => e)
).flat();

推荐阅读