将一维二进制数组拆分为仅连续的二维数组

Split 1D Binary Array into 2D Array of Consecutive Ones Only

假设我想将一个二进制 ID 数组 arr 拆分为二维数组 newArr,其中连续的 1 散布在零之间。此外,我想在名为 Index.

的二维数组中收集所选索引的相应索引

arr = [1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1];

预期结果:

newArr = [[1, 1, 1] , [1, 1],[1, 1]];

Index = [[3,4,5], [7,8],[10,11]];

附上我对这个问题的尝试,但是不行。

var arr = [1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1];

var newArr = [];
let i = arr.length
while(i--){
  if ((arr[i]===1) && (arr[i+1]===1)){
   newArr.push(arr.splice(0,3));
  }
}

console.log(newArr)

您可以减少数组并收集具有前导或后继的项目。

const
    getConnectedParts = array => array.reduce((r, v, i, a) => {
        if (!v || !a[i - 1] && !a[i + 1]) return r;
        if (!a[i - 1]) {
            r.values.push([]);
            r.indices.push([]);
        }
        r.values[r.values.length - 1].push(v);
        r.indices[r.indices.length - 1].push(i);
        return r;
    }, { values:[], indices: [] });

var array = [1, 0, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1],
    { values, indices } = getConnectedParts(array);

values.map(a => console.log(...a));
indices.map(a => console.log(...a));
.as-console-wrapper { max-height: 100% !important; top: 0; }