【问题标题】:Split 1D Binary Array into 2D Array of Consecutive Ones Only将一维二进制数组拆分为仅由连续一维组成的二维数组
【发布时间】:2019-12-09 21:55:31
【问题描述】:

想象一下,我想将二进制 ID 数组 arr 拆分为 2D 数组 newArr,其中连续的 1 散布在零之间。此外,我想在名为 Index 的二维数组中收集所选索引的相应索引。

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

预期结果:

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

索引 = [[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)

【问题讨论】:

    标签: javascript multidimensional-array array-splice


    【解决方案1】:

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

    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; }

    【讨论】:

    • 如果我想将问题扩展到多维输入数组,我该如何调整代码。假设我有数组 = [ [1, 1, 0, 1, 1, 1, 1],[1, 0, 1, 1, 0],[1, 0, 0, 1, 1, 0, 1, 1 , 0, 1, 1, 1] ],我想对每个内部数组执行相同的操作。我试图调整你的代码来解决这个问题,但我没有成功。请帮忙。
    • 您可以将转换移动到函数中并映射函数的结果。也许你需要改变结果对象的结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2023-03-08
    • 2020-11-18
    • 1970-01-01
    • 2018-11-20
    相关资源
    最近更新 更多