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

时间:2015-02-11 15:34:41

标签: javascript arrays input

我试图获取一个我称之为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;

4 个答案:

答案 0 :(得分:1)

最大的问题是你永远不会访问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是真实的),并将条件换成三元:

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

答案 1 :(得分:0)

这是错误的:

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)

答案 2 :(得分:0)

这里有一些错误;

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

答案 3 :(得分:0)

我在您的代码中看到的一些内容:

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