如何检索和收集数组项第一次出现的索引,同时考虑相同项的连续顺序?

问题描述

我正在计算连续的零并将每个零视为单独的块并将其推送到这样的数组块 [3,1,1] ,我需要做的是推送每个中第一个元素的位置像这样在另一个数组中阻塞 [2,13,15]

var A = [1,0];
var N = A.length
function Avaiblocks(A,N,X){
  var counter = 0;
  var Blocks = [];
  var POS =[];
    
  for(var i = 0; i < A.length; i++) {
      if(A[i] === 0){
          counter++;
          POS.push(i) 
        } else {
            if (counter !== 0) {
                Blocks.push(counter)
                counter = 0;
            }
        }
    }
    if (counter !== 0){
      Blocks.push(counter)
        }
return POS;

解决方法

let arr = [1,1,0]

let result = Array.from(arr.join("").matchAll(/0+/g),m=>m['index'])

console.log(result)

,

Array.prototype.reduce 迭代给定的数组。

将 reducer 函数和一个额外的空数组作为收集器传递给它。

对于每次迭代,reduce 函数都可以访问其收集器(此处为 list)、当前处理的 item、当前的 idx(index) 和处理的 arr (数组)本身。

下一次迭代再次将前一次/当前迭代的返回值视为收集器/list

因此,对于 OP 的示例,需要返回一个数组,对于每次迭代,该数组要么连接当前 idx,以防找到连续零序列的第一个 0 值(因此条件 ... (item === 0 && arr[idx - 1] !== 0)) 或确实连接了一个空数组并返回此结果 ...

function collectIndexOfFirstOneOfConsecutiveZeros(list,item,idx,arr) {
  return list.concat(
    (item === 0 && arr[idx - 1] !== 0)
    ? idx
    : []
  );
}
const sampleList = [1,0];

console.log(
  sampleList.reduce(collectIndexOfFirstOneOfConsecutiveZeros,[])
);

// ... or directly like ...

console.log(
  [1,0]
    .reduce((list,arr) =>
      list.concat((item === 0 && arr[idx - 1] !== 0) ? idx : []),[]
    )
);