修改输入中的数组,然后返回输出

Modifying arrays from an input then returning an output

本文关键字:然后 返回 输出 数组 输入 修改      更新时间:2023-10-06

我正试图获得一个我称为input的数组,并在其上循环。

如果任何值都是奇数,那么它们将乘以2。

如果有偶数,它们被2除,然后被推送到一个输出数组,然后我可以返回。

到目前为止,我有这个,(使用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)行检查数组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只能返回01,所以您可以用else替换第二个条件,或者假设它返回0:

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

由于JS如何处理true和false,特别是转换数字,您可以省略== 11是truthy),并将条件交换为三进制:

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(可能是通过出色的6to5项目),您可以用箭头函数替换函数声明:

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);

我在您的代码中看到的一些东西:

  • 您没有从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;
}

这是错误的:

for (i=0; i=input.length; i++) {
      if (input % 2 == 1) {

CCD_ 22是整个阵列。你不能用2来模化一个数组。

您需要使用[]操作符检查单个元素:

if (input[i] % 2 == 1) ...

这同样适用于if条件的主体内部:

        input*2;
        output.push[input];

这需要是input[i] * 2,并且还需要存储该值。现在,您有两个不相关的语句:input * 2,它(如果正确的话)会计算值并丢弃它。然后(再说一遍,您的语法是正确的,这里需要()而不是[]output.push[input]会将原始值附加到output

[]用于访问数组中的元素,()用于调用函数。CCD_ 33是一个函数。该行可以正确地写为:

output.push(input[i] * 2)

这里有一些错误;

for循环条件确保i等于数组的长度,而不是小于它。除非输入数组为空,否则循环永远不会运行。

for(var i = 0; i < input.length; i++)

您正在检查输入(数组)是否可被2整除,而不是输入中的元素是否为.

if(input[i] % 2 === 1)

您还将对数组对象(而不是数组中的元素)执行数学运算,并且不会将其持久化到任何位置。

var multiplied = input[i] * 2;

您将输出数组的push方法作为数组调用,而不是作为函数调用。

output.push(multiplied);

相关文章: