简单的For Loop正常运行时,我的forEach方法有什么问题

时间:2019-09-16 11:48:42

标签: javascript dictionary foreach cycle

因此,给定数组,我有一个简单的任务:let arr = [true,false,true,false,true];我需要将真假改为假,反之亦然。 我已经通过for循环做到了这一点:它工作正常。

现在,我正在尝试使用forEach进行相同操作,但我不知道为什么这行不通。所以,这是我的代码:

for (let i = 0; i < arr.length; i++) {
    if (arr[i] === true) arr[i] = false;
    else arr[i] = true;
} // it works

// for some reason, this doesn't
arr2.forEach(el => el === true ? el = false : el = true);
console.log(arr)

//Neither this: 
arr.forEach(el => el === true && el = false || el === false && el = true);
console.log(arr)

该地图也不起作用: 有人可以指出我的错误并解释我做错了什么吗?也许显示其他解决方法?使用过滤器,减少还是更可取? 单线解决方案是高度首选的。 谢谢您的回答!

7 个答案:

答案 0 :(得分:3)

您需要的是Array.prototype.map,因为分配el不像分配arr[i](它不会改变数组):

arr2 = arr2.map(el => el === true ? false : true);

可以简化为:

arr2 = arr2.map(el => !el);

答案 1 :(得分:3)

您正在分配给el,这是回调的参数。这对数组中的值没有任何影响。将数组元素的复制到el,此后数组元素和el参数之间没有链接。就像这样:

function example(el) {
  console.log("before", el);
  el = 42;
  console.log("after", el);
}

let a = [1];
console.log("a before", String(a));
example(a[0]);
console.log("a after", String(a));

如果要从forEach中分配给数组,则必须按索引进行操作:

arr.forEach((el, index) => el === true ? arr[index] = false : arr[index] = true);

(我强烈建议不要以这种方式滥用条件运算符,但这将是您尝试做的最接近的操作。)

更惯用的方法是使用map!而不是条件运算符:

const newArray = arr.map(el => !el);

答案 2 :(得分:2)

从您的代码中,您尝试更改为 el ,但是由forEach函数传递给回调函数的el变量我认为它按值传递而不是引用传递。根据您的问题,让我们使用 map 函数而不是 forEach

进行重写
const listOfBoolen = [false, true, false, true, true]
const newList = listOfBoolen.map(o => !o)
console.log(newList) // [true, false, true, false, false]

答案 3 :(得分:1)

.forEach()版本中,数组元素中值的副本被传递给回调函数。更改该参数值不会影响数组元素。

您可以使用.map(),但这将创建一个全新的数组:

let newarr = arr.map(el => el == true ? false : true);

您原来的for循环也很好。

答案 4 :(得分:1)

您应该按索引修改数组元素:

let arr = [true, false, true, false, true]
arr.forEach((el, i, a) => el === true ? a[i] = false : a[i] = true);
console.log(arr);
//OR: Simply
//arr.forEach((el, i, a) => a[i] = !el);

答案 5 :(得分:1)

您没有将值分配给arry。您可以使用map()和foreach进行此操作,如下所示

arr = [true, false, true, false, true];
arr =arr.map(val=> this.val=!val);
console.log(arr)

///////////////////////////////////

arr = [true, false, true, false, true];
arr.forEach((val,key)=>arr[key]=!val);
console.log(arr)

答案 6 :(得分:0)

您要更改forEach()回调中提供的参数值,但实际上并未更新数组。

  1. 您需要使用forEach()通过将新值分配给索引来修改原始数组。将布尔值与false进行比较会将其反转,就好像值是false,则false === false将是true,如果值是true然后是true === false应该是false

  2. 使用map并反转值,并从反转后的值中获取新数组。我使用XOR ^来反转布尔值,但是通常的!boolean比这更好。

let arr = [true, false, true, false, true]; 

// Creates a new array and applying xor ^ to inverse the boolean
const inverted = arr.map(el => Boolean(1 ^ el));
console.log(inverted)

// Modifies original array
arr.forEach((el, idx, a) => a[idx] = el === false);
console.log(arr)