我正在尝试创建一个函数,该函数构建一个数组,最多由函数参数设置一个数字,并根据余数是否为零包含 if 条件。数组中的最后一个数字不应大于参数。这是我到目前为止想出的——
function justThreesUpTo(num) {
var array = [];
array.length = num;
for (i = 1; i < array.length; i++) {
if(i % 3 === 0){
array.push(i);
}
else i;
}
array.splice(0, num);
return array;
}
当我控制台记录这个时,用justThreesUpTo(20(,我得到——
// [ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42 ]
我看到问题是在 array.length 上设置限制器,这会最大化数组中可以包含的项目数,但我无法弄清楚还要调用什么来确保数组中的最后一个数字不高于函数调用指定的"num"参数。有什么想法吗?
在填充数组之前将数组的长度设置为某个值并不是一个好主意 - 最好只是迭代num
本身。例如
for (var i = 1; i < num; i++) {
// push to array if i % 3 === 0
您的else i
不会执行任何操作 - 您可以完全关闭它。
如果需要,您可以使代码更短,更干净:
function justThreesUpTo(num) {
const length = Math.floor(num / 3);
return Array.from({ length }, (_, i) => (i + 1) * 3);
}
console.log(justThreesUpTo(20));
在循环访问数组(或其索引,这就是你对i < array.length
所做的(时修改数组是造成混淆的秘诀。从一个空数组开始,然后改为与num
进行比较:
function justThreesUpTo(num) {
var array = [];
for (var i = 1; i < num; i++) {
if (i % 3 === 0) {
array.push(i);
}
}
return array;
}
现在,您可以通过每次增加适当的金额来完全优化结账。
function justThreesUpTo(num) {
var array = [];
for (var i = 3; i < num; i += 3) {
array.push(i);
}
return array;
}
(在您的原始代码中,array.length = num;
创建的整个前num
个孔都未使用并被拼接掉,else i
什么都不做。
你可以尝试一个简单的while
循环
function justThreesUpTo(num) {
var array = [];
var i = 0;
while (i < num) {
if(i % 3 === 0){
array.push(i);
}
i++;
}
return array;
}
console.log(justThreesUpTo(20));
您可以使用map
方法和扩展语法来编写干净的解决方案。
function justThreesUpTo(num) {
return [ ...Array(Math.floor(num/3)).keys() ].map((_,i)=> (i+1) * 3);
}
console.log(justThreesUpTo(20));
嗯,看起来这是一个非常简单的解决方案。将限制器从"array.length"更改为"num",它工作正常。
function justThreesUpTo(num) {
var array = [];
array.length = num;
for (i = 1; i < num; i++) {
if(i % 3 === 0){
array.push(i);
}
else i;
}
array.splice(0, num);
return array;
}
没关系!
在while
循环中使用带有i+=3;
的while
:
function justThreesUpTo(num) {
var array = [];
var i = 0;
while(i<num){
array.push(i);
i+=3;
}
return array;
}
console.log(justThreesUpTo(20));