我可以找到一个列表的元素是否在其他列表中按顺序排列(如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);

07-24 15:09