道招

一个小小的邮件模板搜索排序,前端交互相互拉扯,有这么难吗?

如果您发现本文排版有问题,可以先点击下面的链接切换至老版进行查看!!!

一个小小的邮件模板搜索排序,前端交互相互拉扯,有这么难吗?

最近来了个需求:给现有邮件模板增加搜索功能。但是仅仅是一个如此小的需求,因为新来的交互决定对现有前端功能进行摧毁式大改 ,其预期效果版本竟然是现有交互改版之前的那个版本。。。

这一开倒车的行为招到我的强烈反对,跟交互多次拉锯战后,最终同意听我的在现有结构上进行新增改动。 没错,就是这么硬气,因为她给的理由无法说服改回老版本。

需求

效果大致如下 file

如果搜索关键词既命中模板名称,又命中了模板目录,则模板名称排在前面。 file

需求分析

因为现有的模板信息接口已经全部返回,所以本功能全部由前端完成,前端在全量数据里面进行搜索,排序及展示。

接口返回的数据结构类似

[{
    name: "目录1",
    code: 'a001',
    type: 'CATEGORY',
    children: [{
        name: "目录2",
        code: 'a002',
        type: 'CATEGORY',
        children: [{
            name: "目录22",
            code: 'a0022',
            type: 'CATEGORY',
        }, {
            name: "模板21",
            code: 'm001',
            type: 'TEMPLATE',
        }]},
        {
            name: "模板1",
            code: 'm001',
            type: 'TEMPLATE',
        }
    ]
}]

type为TEMPLATE的为模板,type为CATEGORY的为目录,并且可能下面并没有模板。

鉴于搜索关键字会命中目录和模板,需要在处理数据的时候把各个目录和模板名称收集起来,故在原有的处理逻辑里面加入collection进行收集,只需要判断collection中各个元素是否包含关键字就能判断命中情况了。

const templateHandler = (arr = [], parents = [], collection = []) => {
  const list = arr.filter(item => {
    const paths = [...parents, item];
    const key = paths.map(item => item.code).join('/');
    if (item.type === 'TEMPLATE') {
      collection.push({
        type: 0,
        label: item.name,
        paths,
        key,
      })
      return true;
    } else if (item.type === 'CATEGORY') {
      item.children = templateHandler(item.children || [], paths, collection).list;
      if (item.children.length > 0)  {
        collection.push({
          type: 1,
          label: item.name,
          paths,
          key,
        })
        return true;
      }
    }
  });
  return {
    list,
    collection,
  }
};

上述处理会将空目录(目录22)过滤掉,同时处理好待搜索集collection,为了排序比较方便,我们将TEMPLATE类型的type设置为0,CATEGORY类型的为1。 file

需求实现

接下来我们完成搜索逻辑

function searchHandler(collection, keyword) {
    return collection.filter(item => item.label.includes(keyword)).map(item => {
      const labelPaths = item.paths.map(item => item.name);
      const index = labelPaths.slice().reverse().findIndex(it => it.includes(keyword));
      return {
        idx: index,
        data: item,
      }
    }).sort((a, b) => {
      if (a.data.type === b.data.type) {
        return a.idx <= b.idx ? -1 : 1;
      } else {
        return a.data.type < b.data.type ? -1 : 1;
      }
    })
}

设置idx为了方便后续排序

我们试着搜索下“1”,看看结果如何 file

符合预期,模板在前,目录在后。

搜索“目录”,结果依然符合预期 file

更新时间:
上一篇:使用app的华为应用内支付服务还是小心为上,2023年了还有人在支付场景使用http。。。下一篇:《Nest 通关秘籍》学习nest笔记 Provide注入、循环依赖、动态Module

相关文章

分享jquery仿apple官网伸缩弹性搜索框

代码如下 [code lang="php"] &lt;!DOCTYPE HTML&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv=&quo 阅读更多…

事实证明百度收录道招网内容神速

今天早上刚想起玩魔兽世界,就发表了如何下载 魔兽世界《大地的裂变》的升级补丁和完整客户端 一文,没想到很快就有网友通过百度搜索到了此文, &nbsp; 百度在几个小时前就收录了 阅读更多…

searchpath让你的网站在当前直接显示搜索结果

每一个网站都应该有搜索功能吧,是不是厌烦了在输入搜索词回车后跳转到另一个页面了啊,呵呵,如果你喜欢很酷的显示方式,并且数据量也不是特别大,那么现在就有一个很简单的解决方案哦。 还支持“显示 阅读更多…

谷歌,你快回来吧

不是我不想用谷歌搜索,自从你蜗居香港之后,我时常登录www.google.com.hk登录不了,有时候能登录,等我把结果搜索出来了又会经常出现进不去的事情,只都是因为你对你的搜索结果的网站实现了转向的 阅读更多…

再用360搜索,百度连一个流量都不给你

经过长期使用360搜索,百度贡献流量已大幅下滑,你们也有这样的情形吗? 百度,你也太嚣张了。 继续支持360挑战巨头!!!(虽然我也不怎么喜欢360) 阅读更多…

关注道招网公众帐号
友情链接
消息推送
道招网关注互联网,分享IT资讯,前沿科技、编程技术,是否允许文章更新后推送通知消息。
允许
不用了