将一维二进制数组拆分为仅连续的二维数组
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; }
假设我想将一个二进制 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; }