从提供的数组中以确定的长度创建新数组的好方法,无需以0开头

问题描述 投票:-1回答:1

我想我实现了我的目标,但我确信这不是实现目标的最佳方法。我有一个函数,有个问题使它添加了一些额外的[0],我知道这是因为while测试继续进行。我不需要用while + splice来做。我想提出一些建议以使其更容易。我的目标是从提供的数组开始,始终从不同于0的元素开始创建新数组,并且将以k:

提供长度。
function splitNumber(arrayProvided, k) {
  let newArray = [];

  while (arrayProvided.length > 0) {
    newArray.push(
      arrayProvided.splice(
        arrayProvided.findIndex(el => el),
        k
      )
    );
  }
  return newArray;
}

console.log(
  splitNumber([1, 0, 4, 6, 0, 7, 8, 4, 2, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 6], 4)
);

此代码的结果是:

[
  [ 1, 0 ], [ 4, 6 ],
  [ 7, 8 ], [ 4, 2 ],
  [ 8, 3 ],    [ 6 ],
     [ 0 ],    [ 0 ],
     [ 0 ],    [ 0 ],
     [ 0 ],    [ 0 ],
     [ 0 ],    [ 0 ],
     [ 0 ]
]

这是正确的,部分原因是作业完成添加额外的[0]后系统正在执行额外的工作。系统不能在第一个数组位置以0值开头,并且不需要多余的[0](这是因为逻辑并不完全正确),是的,新数组的长度是k值。

javascript arrays splice
1个回答
1
投票

没有零,您可以添加另一个循环并忽略不需要的零。

此方法不会不变异给定的数据。

function splitNumber(array, k) {
    let result = [],
        i = 0;

    while (i < array.length) {
        if (array[i] === 0) {
            i++;
            continue;
        }
        result.push(array.slice(i, i += k));
    }
    return result;
}

console.log(splitNumber([1, 0, 4, 6, 0, 7, 8, 4, 2, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 6], 4));

0
投票

我认为使用findIndex隐式检查非零指标已经是一个非常聪明的解决方案。但是,您需要处理它返回-1的情况,就像未找到非零条目的情况一样。因此,检查一下可以解决您的问题。

function splitNumber(arrayProvided, k) {
  let newArray = [];

  while (arrayProvided.length > 0) {
    let nonZeroStartIndex = arrayProvided.findIndex(el => el )
    if( nonZeroStartIndex == -1 ){
      break; 
    }
    else{
      newArray.push(
        arrayProvided.splice( arrayProvided.findIndex(el => el ), k )
        );
    }
  }
  return newArray;
}

console.log(
  splitNumber([1, 0, 4, 6, 0, 7, 8, 4, 2, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 6], 4)
);

然后,可以将支票上移至while循环,以便在找不到更多非零条目时让其正常退出

function splitNumber(arrayProvided, k) {
  let newArray = [];
  let nonZeroStartIndex = arrayProvided.findIndex(el => el )
  while (nonZeroStartIndex != -1) {
    newArray.push( arrayProvided.splice( arrayProvided.findIndex(el => el ), k ) );
    nonZeroStartIndex = arrayProvided.findIndex(el => el )
    }
  return newArray;
}

console.log(
  splitNumber([1, 0, 4, 6, 0, 7, 8, 4, 2, 0, 8, 3, 0, 0, 0, 0, 0, 0, 0, 6], 4)
);
© www.soinside.com 2019 - 2024. All rights reserved.