从输入修改数组然后返回输出
Modifying arrays from an input then returning an output
我正在尝试获取一个名为 input
的数组并对其进行循环。
如果任何值是奇数,则将它们乘以 2。
如果有的话,它们会被除以 2,然后被推送到一个输出数组,然后我可以 return。
到目前为止我有这个,(使用 cmd
节点):
function modify(input) {
var output = [];
for (i=0; i=input.length; i++) {
if (input % 2 == 1) {
input*2;
output.push[input];
}
if (input % 2 == 0) {
input/2;
output.push[input];
}
}
return output;
}
module.exports.modify = modify;
最大的问题是您永远无法访问 input
的元素,而只能访问数组本身。您的 if (input % 2 == 1)
行检查 the array mod 2 是否等于 1。这没有意义,因为您不能真正对数组进行数学运算.
您需要对每个元素执行此操作,因此最小的更改是在循环中使用 input[i]
。
您还可以进行许多其他更改,以及一些可以使代码更好的惯用模式。如果您使用的是最新的浏览器并且有 forEach
或 map
,您可以将循环替换为如下构造:
var output = input.map(function (it) {
if (it % 2 == 1) return it * 2;
if (it % 2 == 0) return it / 2;
});
仍然可以清理,因为 x % 2
只能 return 0
或 1
,所以你可以用 [=24 替换第二个条件=] 或者假设它 returned 0:
var output = input.map(function (it) {
if (it % 2 == 1) return it * 2;
return it / 2;
});
由于JS处理true和false的方式,特别是转换数字,你可以省略== 1
(1
为真),并将条件换成三元:
var output = input.map(function (it) {
return (it % 2) ? it * 2 : it / 2;
});
因为你把它包装成一个函数,如果你使用 map
那么 output
并不是绝对必要的,所以你可以这样做:
module.exports.modify = function (input) {
return input.map(function (it) {
return (it % 2) ? it * 2 : it / 2;
});
};
如果你有 ES6 支持(可能通过 the brilliant 6to5 project),你可以用箭头函数替换函数声明:
module.exports.modify = (input) => {
return input.map((it) => {
return (it % 2) ? it * 2 : it / 2;
});
};
如果你想真正了解它,你可以删除 return
语句(感谢箭头函数):
module.exports.modify = input => input.map(it => it % 2 ? it * 2 : it / 2);
这是错误的:
for (i=0; i=input.length; i++) {
if (input % 2 == 1) {
input
是整个数组。您不能对数组进行 2 取模。
您需要使用 []
运算符检查单个元素:
if (input[i] % 2 == 1) ...
同样适用于if
条件的内部:
input*2;
output.push[input];
这需要 input[i] * 2
,并且您还需要 存储 该值。现在,您有两个不相关的语句:input * 2
,它们(如果正确的话)将计算值并将其丢弃。然后(同样,您的语法是正确的,您需要 ()
而不是 []
) output.push[input]
会将原始值附加到 output
.
[]
用于访问数组中的元素,()
用于调用函数。 push
是一个函数。该行可以正确地写成:
output.push(input[i] * 2)
这里有一些错误;
你的 for 循环条件确保 i 等于 数组的长度,不小于它。除非您的输入数组为空,否则循环永远不会 运行.
for(var i = 0; i < input.length; i++)
您正在检查 input(数组)是否可以被 2 整除,而不是 input 中的元素是否可以被 2 整除。
if(input[i] % 2 === 1)
您还在对数组对象执行数学运算,而不是数组中的元素,并且您没有在任何地方持久化它。
var multiplied = input[i] * 2;
您是将输出数组的 push 方法作为数组而不是函数调用来调用。
output.push(multiplied);
我在你的代码中看到的一些东西:
- 您没有从
input
中获取值,而是使用了整个数组。
- 你的for循环的终止条件设置错误(应该是
i < input.length
)
- 您没有将运算结果(
input*2
和 input/2
)重新赋值给值。即使您没有引用数组本身,您也会插入一个未修改的值。
- 您在调用
push()
时使用的是方括号而不是圆括号
试试这个:
function modify(input) {
var output = [];
for (i=0; i<input.length; i++) {
var inval = input[i];
if (inval % 2 == 1) {
inval = inval*2;
output.push(inval);
} else {
inval = inval/2;
output.push(inval);
}
}
return output;
}
我正在尝试获取一个名为 input
的数组并对其进行循环。
如果任何值是奇数,则将它们乘以 2。
如果有的话,它们会被除以 2,然后被推送到一个输出数组,然后我可以 return。
到目前为止我有这个,(使用 cmd
节点):
function modify(input) {
var output = [];
for (i=0; i=input.length; i++) {
if (input % 2 == 1) {
input*2;
output.push[input];
}
if (input % 2 == 0) {
input/2;
output.push[input];
}
}
return output;
}
module.exports.modify = modify;
最大的问题是您永远无法访问 input
的元素,而只能访问数组本身。您的 if (input % 2 == 1)
行检查 the array mod 2 是否等于 1。这没有意义,因为您不能真正对数组进行数学运算.
您需要对每个元素执行此操作,因此最小的更改是在循环中使用 input[i]
。
您还可以进行许多其他更改,以及一些可以使代码更好的惯用模式。如果您使用的是最新的浏览器并且有 forEach
或 map
,您可以将循环替换为如下构造:
var output = input.map(function (it) {
if (it % 2 == 1) return it * 2;
if (it % 2 == 0) return it / 2;
});
仍然可以清理,因为 x % 2
只能 return 0
或 1
,所以你可以用 [=24 替换第二个条件=] 或者假设它 returned 0:
var output = input.map(function (it) {
if (it % 2 == 1) return it * 2;
return it / 2;
});
由于JS处理true和false的方式,特别是转换数字,你可以省略== 1
(1
为真),并将条件换成三元:
var output = input.map(function (it) {
return (it % 2) ? it * 2 : it / 2;
});
因为你把它包装成一个函数,如果你使用 map
那么 output
并不是绝对必要的,所以你可以这样做:
module.exports.modify = function (input) {
return input.map(function (it) {
return (it % 2) ? it * 2 : it / 2;
});
};
如果你有 ES6 支持(可能通过 the brilliant 6to5 project),你可以用箭头函数替换函数声明:
module.exports.modify = (input) => {
return input.map((it) => {
return (it % 2) ? it * 2 : it / 2;
});
};
如果你想真正了解它,你可以删除 return
语句(感谢箭头函数):
module.exports.modify = input => input.map(it => it % 2 ? it * 2 : it / 2);
这是错误的:
for (i=0; i=input.length; i++) {
if (input % 2 == 1) {
input
是整个数组。您不能对数组进行 2 取模。
您需要使用 []
运算符检查单个元素:
if (input[i] % 2 == 1) ...
同样适用于if
条件的内部:
input*2;
output.push[input];
这需要 input[i] * 2
,并且您还需要 存储 该值。现在,您有两个不相关的语句:input * 2
,它们(如果正确的话)将计算值并将其丢弃。然后(同样,您的语法是正确的,您需要 ()
而不是 []
) output.push[input]
会将原始值附加到 output
.
[]
用于访问数组中的元素,()
用于调用函数。 push
是一个函数。该行可以正确地写成:
output.push(input[i] * 2)
这里有一些错误;
你的 for 循环条件确保 i 等于 数组的长度,不小于它。除非您的输入数组为空,否则循环永远不会 运行.
for(var i = 0; i < input.length; i++)
您正在检查 input(数组)是否可以被 2 整除,而不是 input 中的元素是否可以被 2 整除。
if(input[i] % 2 === 1)
您还在对数组对象执行数学运算,而不是数组中的元素,并且您没有在任何地方持久化它。
var multiplied = input[i] * 2;
您是将输出数组的 push 方法作为数组而不是函数调用来调用。
output.push(multiplied);
我在你的代码中看到的一些东西:
- 您没有从
input
中获取值,而是使用了整个数组。 - 你的for循环的终止条件设置错误(应该是
i < input.length
) - 您没有将运算结果(
input*2
和input/2
)重新赋值给值。即使您没有引用数组本身,您也会插入一个未修改的值。 - 您在调用
push()
时使用的是方括号而不是圆括号
试试这个:
function modify(input) {
var output = [];
for (i=0; i<input.length; i++) {
var inval = input[i];
if (inval % 2 == 1) {
inval = inval*2;
output.push(inval);
} else {
inval = inval/2;
output.push(inval);
}
}
return output;
}