在数组中查找序列的第一个索引
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
值或通过可能出现 0
的 zerosMin
字符串的点:
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));
在这个函数中,我计算了长度至少为 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
值或通过可能出现 0
的 zerosMin
字符串的点:
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));