我正在尝试创建一个函数,该函数将数组构建为函数参数设置的数字,并根据余数是否为零包含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;
}
当我通过控制台记录这个时,只需要使用ThreesUpTo(20),我得到 -
// [ 3, 6, 9, 12, 15, 18, 21, 24, 27, 30, 33, 36, 39, 42 ]
我看到问题是在array.length上设置限制器,这会最大化数组中可以包含的项目数,但是我无法弄清楚还有什么要调用以确保数组中的最后一个数字不高于函数调用指定的“num”参数。有什么想法吗?
答案 0 :(得分:3)
在循环上修改数组(或其索引,这是你用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;
}
(在原始代码中,num
创建的所有第一个array.length = num;
漏洞未使用并被拼接,else i
什么也没做。)
答案 1 :(得分:3)
在填充数组之前将数组的长度设置为某个东西并不是一个好主意 - 最好只是迭代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));
答案 2 :(得分:1)
您可以尝试使用简单的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));
答案 3 :(得分:1)
您可以使用map
方法和传播语法来编写一个干净的解决方案。
function justThreesUpTo(num) {
return [ ...Array(Math.floor(num/3)).keys() ].map((_,i)=> (i+1) * 3);
}
console.log(justThreesUpTo(20));
&#13;
答案 4 :(得分:0)
嗯。看起来这是一个非常简单的解决方案。将限制器从“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;
}
没关系!
答案 5 :(得分:0)
在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));