我想我实现了我的目标,但我确信这不是实现目标的最佳方法。我有一个函数,有个问题使它添加了一些额外的[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值。
没有零,您可以添加另一个循环并忽略不需要的零。
此方法不会不变异给定的数据。
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));
我认为使用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)
);