检查array1是否包含在array2中且元素的顺序完全相同?

时间:2018-07-12 22:04:40

标签: javascript arrays algorithm

将此称为array 1

["one","two","three","four","five"]

我有第二个数组array 2,它是array 1的子集。可能看起来像这样:

["one","two"]

我现在要检查array 2的元素是否与array 1中的元素相同。 array 2中有多少个元素都没有关系,但是它们必须以相同的顺序排列。

例如:

["one","two"] ==> true
["two","three"] ==> true
["one","three"] ==> false
["two","one"] ==> false

我相信我已经解决了这个问题,但是我想知道是否有更好的解决方案或方法,当然,我想知道是否存在我不应该做的隐含假设或错误我已经承诺。我的解决方案如下所示:

let arr = ["s1","s2","s3","s4","s5","s6"];
let subArray = ["s4","s5"];

let counter = 0;

for(let i=0;i<=arr.length;i++) {
  if(arr[i] === subArray[counter]) {
    counter++;
  } else if(counter>0) {
    counter=0;
  }
  if(counter === subArray.length) {
    console.log('consecutive');
    return true;
  }
}
if(counter !== subArray.length) {
  console.log('not consecutive i guess');
  return false;
}

2 个答案:

答案 0 :(得分:4)

使用Array.findIndex()在子数组中第一个元素的包含数组中找到索引(startIndex)。然后使用Array.every()迭代子数组,并检查从startIndex开始,子数组的项在包含数组中是否具有等效项:

const isContained = (arr1, arr2) => {
  const startIndex = arr1.findIndex((item) => item === arr2[0]);
  
  if(startIndex === -1) return false;
  
  return arr2.every((item, i) => item === arr1[i + startIndex]);
}

console.log(isContained(["s1","s2","s3","s4","s5","s6"], ["s4","s5"])); // true

console.log(isContained(["s1","s2","s3","s4","s5","s6"], ["s6","s5"])); // false

答案 1 :(得分:4)

您可以偷偷摸摸地做一些事情,例如连接两个数组元素,然后查看连接的测试数组元素是否是原始数组连接的元素的子字符串。

例如:

function containsElementsInSameOrder(arr, elements) {
    return arr.join(' ').indexOf(elements.join(' ')) > -1;
}