我尝试创建的内容:
我有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
我认为这可以实现:
<div>
<Label type="author" value="Stan"/>
<p>cats</p>
<Label type="year" value="1990"/>
</div>
并按照编写顺序放入数组:-
author:Stan dogs cats year:1990
-
[
{
type: "author",
value: "stan"
},
{
type: "text",
value: "dogs cats"
},
{
type: "year",
value: "1990"
}
]
数组并检查每个条目的类型 - 如果不是map
返回text
:-
<Label/>
-
问题:
使用编写的顺序将array.map(({ type, value }) => {
if (type === 'text') {
return <p>value</p>
}
return <Label type={type} value={value} />
})
解析为数组。我仍然不知道如何正确地执行此操作,因为例如,如果我们应用author:Stan dogs cats year:1990
,那么订单将不会被应用。
我希望有人有一些想法。
答案 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)
您想要测试边缘情况,最终我认为它不是一个非常好的系统,但我认为以下情况应该会让您有一个良好的开端。
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;