javascript 我们不能在forEach内部重新分配数组值吗?[重复]

qlckcl4x  于 2023-03-21  发布在  Java
关注(0)|答案(4)|浏览(104)

此问题在此处已有答案

(33个答案)
change values in array when doing foreach(11个答案)
昨天关门了。
问题陈述是,我应该用0替换5以下的任何数字,用1替换5及以上的任何数字。
我正在尝试重新分配值,但没有影响,为什么?

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

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

uxhixvfz

uxhixvfz1#

这样使用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("");

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

if (Number(num) >= 5) {
  num = "1";
} else {
  num = "0";
}
ar5n3qh5

ar5n3qh52#

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

请注意,您也可以使用其他原型,我只是尽可能地接近您的解决方案,您可能还希望使用map,甚至(尽管不合适)reduce,甚至常规的for循环。

sgtfey8w

sgtfey8w3#

要使用forEach来实现这一点,您需要使用额外的参数来引用数组和索引。

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

console.log(fakeBinary('3457'));

但是forEach不是返回一个新数组的正确方法。

function fakeBinary(n) {
    return n
      .split('')
      .map(num => (Number(num) < 5) ? '0' : '1')
      .join('');
}

console.log(fakeBinary('3457'));
flseospp

flseospp4#

使用Array.from()较短版本

const fakeBinary = (str) => Array.from(str, n => +(+n >= 5)).join('');

console.log(fakeBinary('3457'));

相关问题