将搜索文本解析为Array

时间:2018-01-22 15:21:05

标签: javascript arrays regex reactjs

我尝试创建的内容:

我有1个输入,用户可以在其中搜索数据。他可以像这样SELECT id, md5, WHEN md5 = MD5('abc') THEN 'abc' WHEN md5 = MD5('def') THEN 'def' ELSE NULL END AS identity FROM url WHERE md5 in (MD5('abc'), MD5('def')); 进行搜索,或者他可以使用这样的标签进行搜索cats(将寻找1990年作者是Stan的镜头拍摄的猫)。当用户写author:Stan cats year:1990时,应将其替换为组件

author:Stan cats year:1990

我认为这可以实现:

  1. 解析<div> <Label type="author" value="Stan"/> <p>cats</p> <Label type="year" value="1990"/> </div> 并按照编写顺序放入数组:
  2. -

    author:Stan dogs cats year:1990

    -

    1. [ { type: "author", value: "stan" }, { type: "text", value: "dogs cats" }, { type: "year", value: "1990" } ] 数组并检查每个条目的类型 - 如果不是map返回text
    2. -

      <Label/>

      -

      问题:

      使用编写的顺序将array.map(({ type, value }) => { if (type === 'text') { return <p>value</p> } return <Label type={type} value={value} /> }) 解析为数组。我仍然不知道如何正确地执行此操作,因为例如,如果我们应用author:Stan dogs cats year:1990,那么订单将不会被应用。

      我希望有人有一些想法。

2 个答案:

答案 0 :(得分:0)

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

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);

答案 1 :(得分:0)

您想要测试边缘情况,最终我认为它不是一个非常好的系统,但我认为以下情况应该会让您有一个良好的开端。

&#13;
&#13;
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);
&#13;
&#13;
&#13;