从输入修改数组然后返回输出

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]

您还可以进行许多其他更改,以及一些可以使代码更好的惯用模式。如果您使用的是最新的浏览器并且有 forEachmap,您可以将循环替换为如下构造:

var output = input.map(function (it) {
    if (it % 2 == 1) return it * 2;
    if (it % 2 == 0) return it / 2;
});

仍然可以清理,因为 x % 2 只能 return 01,所以你可以用 [=24 替换第二个条件=] 或者假设它 returned 0:

var output = input.map(function (it) {
    if (it % 2 == 1) return it * 2;
    return it / 2;
});

由于JS处理true和false的方式,特别是转换数字,你可以省略== 11为真),并将条件换成三元:

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*2input/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;
}