js实现关键字匹配高亮显示

4 篇文章 0 订阅
1 篇文章 0 订阅

JS实现搜索关键字匹配高亮显示

首先看效果
在这里插入图片描述
需求:用户输入文字之后,调用后台接口查询匹配关键字(模糊搜索),并把匹配到的关键字进行高亮显示。

实现思路:将拿到的数据进行拆分,例如:用户输入“羽毛球“,接口返回数据“{label:‘羽毛球手胶’}”,需要把羽毛球三个字高亮展示,首先我们将数据进行拆分,使用indexOf找到是否存在“羽毛球“字符串,找到关键字之后进行存储,将带有关键字的部分全部删掉,继续匹配,知道匹配结束。

代码实现(代码为小程序代码,其他语言思路一致):

	matchingKeyFun() {
		let keyword = this.data.keyword;
		// 添加测试数据
		let arr = [
			{ label: '羽毛球关键字提示' },
			{ label: '关键字搜索匹配羽毛球' },
			{ label: '羽毛球搜索' },
			{ label: '羽毛球拍测试羽毛球服测试羽毛球' }
		];
		// 最后输出数组
		let matchingKeys = [];
		arr.forEach((item, index) => {
			let f = true, label = item.label;
			matchingKeys[index] = [];
			while (f) {
				// 找到当前位置
				let position = label.indexOf(keyword);
				if (position == -1) {
					f = false;
					// 未匹配到关键字
					matchingKeys[index].push({ label: label.substring(0, label.length) })
				} else {
					// 匹配位置+关键字长度
					let matchEnd = position + keyword.length;
					// 非匹配中的关键字
					matchingKeys[index].push({ label: label.substring(0, position) })
					// 匹配中的关键字
					matchingKeys[index].push({ label: label.substring(position, matchEnd), checked: true })
					// 去掉匹配到文字,重新进行筛选
					label = label.substring(matchEnd, label.length);
					// 匹配到了末尾,不再继续匹配
					if (!label && label.length < 1) {
						f = false;
					}
				}
			}
		})
		this.setData({
			matchingKeys: matchingKeys
		})
	},

页面渲染

	<view class="matching-key-block">
      <view class="matching-item" wx:for="{{matchingKeys}}" wx:key="~this" wx:for-item="arr">
        <view class="{{item.checked?'match-color':''}}" wx:for="{{arr}}" wx:key="~this">
          {{ item.label || '' }}
        </view>
      </view>
    </view>

css部分就不过多描述

公司项目碰到了这个需求,记录一下,方便日后使用!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值