我可以找到列表的元素是否按顺序排列在其他列表中(如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
时跳过单个元素,并且想要返回第一个匹配(并且可以扩展函数以在搜索中包含起始索引)。
答案 0 :(得分:1)
要做出一些假设:
search
中的值是唯一的,因此没有['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);