我们不能在forEach中重新分配数组值吗?

iam*_*van 3 javascript arrays

问题陈述是,我应将5以下的任何数字替换为0,并将5以上的任何数字替换为1。

我正在尝试重新分配值,但没有影响,为什么?

function fakeBinary(n) {
    let numbersArr = n.split('');
    numbersArr.forEach(num => {
        if(Number(num) < 5) {
            num = '0';
        } else if(Number(num) >= 5) {
            num = '1';
        }
    });
    return numbersArr.join('');
}

console.log(fakeBinary('3457'));
Run Code Online (Sandbox Code Playgroud)

我除了的输出0011,但实际输出是3457

bri*_*eje 5

forEach不会为原始值带来元素的引用,而是为您带来案例值的副本。您可以通过索引轻松地手动访问它,但是:

function fakeBinary(n) {
    let numbersArr = n.split('');
    numbersArr.forEach((num, i) => {
//                          ^--- note that `i` is brought and used below to access the element at index [i].
        if(Number(num) < 5) {
            numbersArr[i] = '0';
        } else if(Number(num) >= 5) {
            numbersArr[i] = '1';
        }
    });
    return numbersArr.join('');
}


console.log(fakeBinary('3457'));
Run Code Online (Sandbox Code Playgroud)

请注意,您可能还会使用其他原型,我只是想尽可能地与您的解决方案保持联系,您可能还想使用mapor甚至(不适当)reduce或常规的for循环。


Jac*_*ord 5

forEach这样使用不会做任何事情- map而是使用。

let numbersArr = n.split("").map(num => {
  if (Number(num) > 5) {
    num = "0";
  } else if (Number(num) <= 5) {
    num = "1";
  }
  return num;
});

return numbersArr.join("");
Run Code Online (Sandbox Code Playgroud)

请注意,要产生所需的输出,您需要稍微更改条件:

if (Number(num) >= 5) {
  num = "1";
} else {
  num = "0";
}
Run Code Online (Sandbox Code Playgroud)