【问题标题】:Parse search text in to Array将搜索文本解析为数组
【发布时间】:2018-07-01 06:41:36
【问题描述】:

我尝试创建的内容:

我有 1 个输入,用户可以在其中搜索数据。他可以像这样搜索cats,或者他可以使用像这样的标签搜索author:Stan cats year:1990(将寻找1990年在相机上拍摄的猫,作者是Stan)。当用户写author:Stan cats year:1990时,它应该被替换为组件

<div>
  <Label type="author" value="Stan"/>
  <p>cats</p>
  <Label type="year" value="1990"/>
</div>

我认为这是如何实现的:

  1. 解析author:Stan dogs cats year:1990并按照写入顺序放入数组中:

-

[
  {
    type: "author",
    value: "stan"
  },
  {
    type: "text",
   value: "dogs cats"
  },
  {
    type: "year",
    value: "1990"
  }
]

-

  1. map 数组并检查每个条目的类型 - 如果不是 text,则返回 &lt;Label/&gt;

-

array.map(({ type, value }) => {
  if (type === 'text') {
    return <p>value</p>
  }
  return <Label type={type} value={value} />
})

-

问题:

author:Stan dogs cats year:1990 解析为具有写入顺序的数组。我仍然不知道如何正确执行,因为例如,如果我们申请regex,那么订单将不会被申请。

我希望有人有一些想法。

【问题讨论】:

  • 请改一下没有意义的奇怪标题:Parse not simple text in to massive
  • 好的,完成。更好?
  • 什么意思?这不是正确的英语 - 在这个上下文中 massive 是什么?
  • “将搜索文本解析为数组”会更好
  • 抱歉,我的错,已修复

标签: javascript arrays regex reactjs


【解决方案1】:

你毫无疑问可以使用正则表达式来做到这一点 - 你认为订单不会被保留的假设很奇怪 - 但你可以使用老式的拆分和减少来做到这一点

var input = "author:Stan dogs cats year:1990";

var result = input.split(' ').reduce(function(p,c){
    // determine if we have a label
    if(c.indexOf(':')>-1){
        var items = c.split(':');
        p.push({type:items[0], value:items[1]});
    }
    else{
        // determine if previous item was text - if so add the value
        if(p[p.length-1].type == "text"){
           p[p.length-1].value += ' ' + c
        }
        else{
           p.push({type:'text',value:c});
        }
    }
    return p;
    
},[]);

console.log(result);

【讨论】:

    【解决方案2】:

    您想测试边缘情况,最终我认为这不是一个很好的系统,但我认为下面的内容应该让您有一个良好的开端。

    let input = 'author:Stan dogs cats year:1990';
    
    let splitInput = input.split(/\s+/);
    
    let searchTerms = [];
    
    const parseTextSearch = (textSearchArray) => {
      return {
        type: 'text',
        value: textSearchArray.join(' ')
      };
    };
    
    const parseCurrentTerm = (term) => {
      let key = term.split(':')[0];
      let value = term.split(':')[1];
      return {
        type: key,
        value: value
      };
    };
    
    let textSearch = [];
    
    for (let i = 0; i < splitInput.length; i++) {
      let currentTerm = splitInput[i];
      if (/\:/.test(currentTerm)) {
        if (textSearch.length > 0) {
          searchTerms.push(parseTextSearch(textSearch));
          textSearch = [];
        }
        searchTerms.push(parseCurrentTerm(currentTerm));
      } else {
        textSearch.push(currentTerm);
      }
      if (i === splitInput.length - 1 && textSearch.length > 0) {
        searchTerms.push(parseTextSearch(textSearch));
      }
    }
    
    console.log(searchTerms);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2015-10-18
      相关资源
      最近更新 更多