我可以找到一个列表的元素是否在其他列表中按顺序排列(如here所述),但在处理一些“混乱”的数据时遇到问题。
例如:
var source = ['the', 'dog', 'therefore', 'he', 'gets', 'a', 'treat'];
var search = ['there', 'fore', 'gets', 'treat']
这个查询数据有两种“混乱”的方式。首先,一些搜索项已被分离(
'there', 'fore'
)。其次,省略了一些字符('he', 'a'
)。如何在源列表中查找“混乱”搜索列表成员的开始和结束索引?(在上面的例子中,我想返回
[2,6]
,它对应于therefore
列表中的treat
@2和source
@6)。Your problem is underspecified.
What's the result for source = ['a', 'aa', 'a', 'b', 'a']],
search = ['a', 'a']? Is it [0, 4] or [0, 2] or [1, 1] or ...?
You could e.g. ask for the first, longest matching 'messy' subsequence. – le_m
好的观点和好的问题。我只需要在搜索
source
时跳过单个元素,并希望返回第一个匹配项(并且可以扩展函数以在搜索中包含起始索引)。 最佳答案
做一些假设:search
中的值是唯一的,因此no['treat', 'treat']
source
中的值也是唯一的。
就效率而言,我实在帮不了你。我希望这能给你一个好的开始的主意。
var source = ['the', 'dog', 'therefore', 'he', 'gets', 'a', 'treat'];
var search = ['there', 'fore', 'gets', 'treat'];
let start, finish;
start = finish = -1;
for (let word of search)
{
for (let i in source)
{
if (source[i].indexOf(word) !== -1)
{
if (start === -1)
{
start = finish = i;
}
else if (i > finish)
{
finish = i;
}
else if (i < start)
{
start = i;
}
break;
}
}
}
console.log(start, finish);