把字符串按照某几个字符切割成数组

我们在工作中,经常会遇到把字符串切割成数组的情况,官方也为我们提供了 stringObject.split(separator,howmany) 方法,实例:

const str = '开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤'
console.log(str.split(','))// 结果
// ['开心哈哈哈哈', '悲伤哈哈哈', '快乐哈哈哈', '是你', '开始', '开心', '悲伤']

但它只能以 某一个字符 进行分割,并且分割完之后,该字符( split(‘开心’) 里的‘开心’ )会被 的 ‘,’ 替换掉,不能保留原始的 字符串。

现在,我们有这样一个需求,把 ‘开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤’ 这个字符串,按照 [’‘开心’, ‘悲伤’] 这两个字符进行切分,并且得到的数组能够完全保留原始字符串

// 输入
const str = '开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤'// 处理
const result = splitFun(str)// 输出
console.log(result)
['开心', '哈哈哈哈,', '悲伤', '哈哈哈,快乐哈哈哈,是你,开始,', '开心', ',', '悲伤']//最终我们再把 输出的数组 渲染到页面上,能够得到 与原始字符串 完全相同的字符串// react:
(result || []).map(item => <span>{item}</span>)// vue:
<span v-for"item in result" :key="item">{{item}}</span>// 开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤

思路梳理:

1、 实现 字符串分割为数组 有很多方式:split, slice,正则表达式…等等方法,最简单的还是采用 split 。
2、 虽然 split 一次只能以一个字符进行分割,但是我们通过 轮询(for循环)的方式,多执行几次,应该是可以达到效果:当我们 第一次把一个字符串 按照第一个字符 分割成为数组之后,还需要对数组里面的 每一项 按照第二个字符 进行分割, 以此类推 可以实现按照多个字符串进行分割。
3、 split 以某个字符 切割完之后,这个字符就被替换为 ‘,’ 了,要想保留原始字符,必须在每次 split 之后,将这个字符插入进去。

第一步:轮询 分割字符 数组

// 为什么以数组的形式存放 该字符串:当我们 第一次把一个字符串 按照第一个字符 分割成为数组之后,
// 还需要对数组里面的 每一项 按照第二个字符 进行分割,这是一个轮询的过程,
// 所以,一开始我们就以一个数组的形式去存放初始数组。
let array = ['开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤']const labels = ['开心', '悲伤']for(let i = 0; i < labels.length; i++) {// 分割字符串操作const twoArray = splitFunc(array, labels[i])
}

第二步:分割字符

const splitFunc = (array, label) => {// 定义 一个数组 去存放这一轮 最终被分割 好的数组const outArray = []// 循环 需要被分割的 数组字符串for(let i = 0; i < array.length; i++) {// 定义 一个数组 去存放 当前项 最终被分割 好的数组let newArr = []// 把 当前项 的字符串 按照 传进来 字符进行分割const splitArr = array[i].split(label)// 得到分割好的数组后,将被 替换为 ‘,’ 的 label 追加进数组的相应位置// 例如: ‘开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤’, 以 ‘开心’ 分割// 被分割为 ["", "哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,", ",悲伤"]// , 每一项的末尾,就应该应该是 开心 二字,最后一项的末尾除外// 遍历被分割好的数组for(let j = 0; j < splitArr.length; j++) {// 向被分割好的数组里 追加 label 字符newArr.push(splitArr[j])// 数组的末尾无需 追加if (j < splitArr.length -1) {newArr.push(label)}}// 把当前轮得到 的数组 推到 outArray 里去outArray.push(newArr)}// 返回 outArray ,注意 outArray 是一个二维数组return outArray
}

第三步:轮询调用 splitFunc 函数

for(let i = 0; i < labels.length; i++) {// 接收 当前轮 返回的 二维数组const twoArray = splitFunc(array, labels[i])// 将二维数组平铺成为 一维数组const oneArray = twoArray.reduce(function (a, b) { return a.concat(b)} )// 过滤掉一维数组里的空字符串,并把它重新赋值给 array, // 下一轮循环将 切割 上一轮 已经被分割好的 数组array = oneArray.filter(item => item !== "")}// 最终循环结束的 array 就是被彻底分割好的数组

最终代码:

const splitFunc = (array, label) => {const outArray = []for(let i = 0; i < array.length; i++) {let newArr = []const splitArr = array[i].split(label)console.log('splitArr', splitArr)for(let j = 0; j < splitArr.length; j++) {newArr.push(splitArr[j])if (j < splitArr.length -1) {newArr.push(label)}}outArray.push(newArr)}return outArray
}let array = ['开心哈哈哈哈,悲伤哈哈哈,快乐哈哈哈,是你,开始,开心,悲伤']const labels = ['开心', '悲伤']for(let i = 0; i < labels.length; i++) {const twoArray = splitFunc(array, labels[i])const oneArray = twoArray.reduce(function (a, b) { return a.concat(b)} )array = oneArray.filter(item => item !== "")}console.log('array', array)

为什么需要如此麻烦的 将一个字符串 分割完成 之后,在组装渲染到页面上?

主要是为了 这些字符里的 关键字符(也就是 需要被分割的字符),在渲染的时候,能够被我们所控制为他设置CSS样式,追加点击事件等等,达到动态的效果,如果仅仅是一个字符串被渲染到页面上,这些操作我们将无法控制。

如果以上算法逻辑有不足之处,欢迎大家指出教导👏👏。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/515459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多角度分析平台即服务?PaaS的类型和用例

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 没有适合所有人的单一PaaS。即使云计算已经发展了10多年&#xff0c;但对云计算服务模型的定义仍然相当模糊。通常&#xff0…

未来,边缘计算的功能支柱是 Kubernetes

来源 | SDNLAB责编 | 寇雪芹头图 | 下载于视觉中国编者按在数字化转型时代&#xff0c;5G网络是一个飞跃。5G正在推动边缘计算的发展&#xff0c;而Kubernetes则是5G与边缘计算之间的粘合剂。云计算的十年云计算之于信息技术(IT)产业&#xff0c;就像石油之于汽车工业一样。云让…

如何在工作中快速成长?致工程师的10个技巧

云栖号资讯&#xff1a;【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯&#xff0c;还在等什么&#xff0c;快来&#xff01; 作者 | 江建明 阿里巴巴高级无线开发专家 导读&#xff1a;精英人数的增长速度持续加快后&#xff0c;很多人开始焦虑&#…

在新项目中使用 Vue3 使用总结

一、使用背景 最近公司需要搭建一个新项目&#xff0c;用于做官网。因为作为官网&#xff0c;首先项目不算大&#xff0c;一共只有十来个页面&#xff0c;并且想要用户体验感很好&#xff0c;所以最终选定以 Vue 作为技术栈。 虽然 Vue3 &#xff08;中文官网&#xff09;刚问…

2020年从架构谈起到Mesh结束

作者 | 张羽辰&#xff08;同昭&#xff09;阿里云交付专家 导读&#xff1a;如今&#xff0c;几乎所有的事情都离不开软件&#xff0c;当你开车时&#xff0c;脚踩上油门&#xff0c;实际上是车载计算机通过力度感应等计算输出功率&#xff0c;最终来控制油门&#xff0c;你从…

Mendix:低代码平台四大常见用例开发

编辑 | 宋慧 供稿 | Mendix 头图 | 付费下载于视觉中国 如今&#xff0c;低代码对很多人来讲可能已经不再是一个陌生的名词。创新的低代码开发平台实现了低级别编码的抽象化和人工流程的自动化。低代码通过可视化开发工具和可重用组件&#xff0c;缩短了定制化网络和移动应用的…

下架已上线的小程序;2.设置不允许被用户搜索到

下架已上线的小程序&#xff1a; 登录微信开发者后台【设置】-【功能设置】-【暂停服务设置】-【暂停服务】&#xff0c;如图 设置小程序不允许被用户搜索到&#xff1a; 登录微信开发者后台【设置】-【功能设置】-【隐私设置】-【关闭】&#xff0c;如图 操作过程中遇到的问题…

5G新基建边缘计算乘风破浪

2019年6月6日&#xff0c;工信部向中国电信、中国移动、中国联通、中国广电发放5G商用牌照&#xff0c;这意味着中国正式进入5G元年。一年以来&#xff0c;随着基站的建设与用户认知的提升&#xff0c;5G应用如雨后春笋般涌现。而在今年上半年频繁被提及的“新基建”中&#xf…

犹豫了几个月,我还是跳槽了....

导语&#xff1a;今天写这篇文章并不是为了痛斥我的&#xff08;即将成为的&#xff09;老东家有多么的不好&#xff0c;而是想和大家聊聊跳槽这件事情&#xff0c;关于开始&#xff0c;关于进行中&#xff0c;关于结束。 关于开始 跳槽无非就两种原因&#xff1a; 一是工资不…

那些年,我在阿里当数据开发

前言&#xff1a; -更多关于数智化转型、数据中台内容请加入阿里云数据中台交流群—数智俱乐部 &#xff08;文末扫描二维码或点此加入&#xff09; -阿里云数据中台官网 https://dp.alibaba.com/index &#xff08;作者&#xff1a;数据从业者 &#xff09; 我是阿里数据部…

太白金星:我很关心分布式 Quorum NWR

来源 | 悟空聊架构责编 | 寇雪芹头图 | 下载于视觉中国先来看一段神秘的对话&#xff1a;太白金星&#xff1a;听闻老君最近在练神丹妙药&#xff0c;可否与我一讲&#xff1f;太上老君&#xff1a;老白啊&#xff0c;我最近在练六颗丹药&#xff1a;两颗延年丹、两颗健步丹、两…

mPaaS小程序技术架构深度解析

⚅ 点击观看《mPaaS 小程序新品发布会》回放 > > 随着小程序技术的愈发成熟&#xff0c;不同平台的优势和典型使用场景各有侧重&#xff0c;同时越来越多的开发者可以结合自身的业务特色&#xff0c;通过小程序作为业务载体&#xff0c;形成单一平台或多平台的协同关系。…

从javaScript数据类型开始了解垃圾回收机制

一、 javaScript数据类型 javaScript 数据类型分为&#xff1a;基本数据类型、引用数据类型 基本数据类型 分类&#xff1a;Number、String、Boolean、Null、Undefined、Symbol。 存储地址&#xff1a;栈。 引用数据类型 分类&#xff1a;Object、Array、Function。 存储地…

直播中那几秒延时到底来自哪?

7月16日&#xff0c;亚太内容分发大会上&#xff0c;阿里云高级产品运营专家俞翔受邀出席&#xff0c;并分享了基于CDN网络构建超低延时直播的场景实践。以下为演讲原文。 近几年&#xff0c;直播带货已经逐渐走进大众视野。在今年上半年受疫情原因影响&#xff0c;直播营销市…

三探云原生全景图,这次聊聊运行时层

在《俯瞰云原生&#xff0c;这便是供应层》我们介绍了云原生全景图的最底层&#xff1a;供应层&#xff0c;本文将带大家了解运行时层&#xff0c;这一层包含了容器在云原生环境中运行所需的一切。作者 | Catherine Paganini&#xff0c;Jason Morgan来源 | K8sMeetup社区头图 …

SpringCloud应用在Kubernetes上的最佳实践—开发部署

作者 | 孤弋 阿里云高级技术专家&#xff0c;负责 EDAS 的开发和用户体验优化工作。 导读&#xff1a;在上一篇文章《SpringCloud 应用在 Kubernetes 上的云上实践 - 开发篇》中讲到可以通过两个工具&#xff0c;轻松地将一个 SpringCloud 应用从初始化到本地运行。本篇文章&a…

解决谷歌浏览器 google chrome 安装插件报错:Download interrupted,不支持 .crx 文件下载

最近给 新的 macBook Pro 2020 笔记本的 chrome 浏览器安装 react developer tools 时&#xff08;翻墙情况下&#xff09;&#xff0c;安装总是不成功&#xff0c;有一个弹框提示&#xff1a;Download interrupted。 一开始我以为是第三方插件出了问题&#xff0c;于是我去安…

低代码,让人人都可以是开发者

作者&#xff1a;流水不争先 来源| 技术领导力(ID&#xff1a;jishulingdaoli)头图 | 下载于视觉中国今年2月23日&#xff0c;外国低代码平台提供商Creatio宣布获得6800万美元融资&#xff1b;2月22日&#xff0c;国内SaaS软件厂商黑湖智造宣布完成C轮近5亿元人民币融资。国内外…