数组函数,用于生成具有数字子集范围的数组



我正在尝试创建一个函数,该函数构建一个数组,最多由函数参数设置一个数字,并根据余数是否为零包含 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));

相关内容

  • 没有找到相关文章

最新更新