在数组中查找序列的第一个索引

Finding the first index of a sequence inside an array

在这个函数中,我计算了长度至少为 zerosMin 的连续零的数量。有什么办法可以 return 序列开头的第一个索引?例如,对于 arr = [1,0,0,0,0,0,1,0,0,0,0] 它将是 [1,7]

function SmallestBlockOfZeros(arr, zerosMin) {
    let result = [];
    let counter = 1;

    for (let i = 0; i < arr.length; i++) {
        if (arr[i] == 0) {
            if (arr[i] === arr[i + 1]) {
                counter++;
            } else if (counter >= zerosMin) {
                result.push(counter);

                counter = 1;
            } else {
                counter = 1;
            }
        }
    }
    return result;
}
let arr = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0];
let zerosMin = 4;

console.log(SmallestBlockOfZeros(arr, zerosMin));
//Console output : [5,4]

每个零链的开始:

function indexOfValue(arr, val) {
    var indexes = [], i;
    for(i = 0; i < arr.length; i++)
        if (arr[i] === val)
            indexes.push(i);
    return indexes;
}

(参见 How to find index of all occurrences of element in array?

您在上面发布的代码似乎适用于 0 块的长度。

您可以遍历数组,每当遇到至少 zerosMin 长的 0 值块时,将索引推入结果数组,然后跳过所有这些 0 值,直到找到下一个非 0 值或通过可能出现 0zerosMin 字符串的点:

let arr = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0];
let zerosMin = 4;

let zeroStarts = [];
for (let i = 0; i <= arr.length - zerosMin; i++) {
  if (arr.slice(i, i + zerosMin).filter(Boolean).length == 0) {
    zeroStarts.push(i);
    i += zerosMin;
    while (i <= arr.length - zerosMin && arr[i] == 0) {
      i++;
    }
  }
}
console.log(zeroStarts);

注意我使用了 filter(Boolean) 因为 0 是错误的;如果您要搜索 运行 个非零值,您可以使用 filter(v => v != 0)

如果不需要实际迭代元素,可以使用快捷方式

function foo(arr, min)
{
  let el = arr.join("").match(new RegExp('0{' + min + ',}'));
  
  return [el.index, el.index + el[0].length];
}

console.log(foo([1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], 3));

在迭代项目时,跟踪最后一个非零 index 并在条件匹配时将索引推送到输出数组。

const SmallestBlockOfZeros = (arr, zerosMin) => {
  let index = 0;
  const output = [];
  for (let i = 0; i <= arr.length; i++) {
    if (arr[i] !== 0 || !(i in arr)) {
      i - index - 1 >= zerosMin && output.push(index + 1);
      index = i;
    }
  }
  return output;
};

const arr = [1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0];
const zerosMin = 4;
console.log(SmallestBlockOfZeros(arr, zerosMin));