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

时间:2019-08-06 14:05:32

标签: 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'));

0011的输出以外,我是其他人,但实际输出为3457

4 个答案:

答案 0 :(得分: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'));

请注意,您也可以使用其他原型,我只是想尽可能地与您的解决方案保持紧密联系,您可能还想使用map甚至(尽管不合适){{1} },甚至常规的for循环。

答案 1 :(得分:5)

tooltip: { shared: true, formatter: function() { return this.y+'<br/> test'; } 不能执行任何操作-请使用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("");

答案 2 :(得分:1)

要使用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不是返回新数组的正确方法。您想使用map()

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

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

答案 3 :(得分:0)

使用Array.from()

较短版本

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

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