因此,给定数组,我有一个简单的任务: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)
该地图也不起作用: 有人可以指出我的错误并解释我做错了什么吗?也许显示其他解决方法?使用过滤器,减少还是更可取? 单线解决方案是高度首选的。 谢谢您的回答!
答案 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()
回调中提供的参数值,但实际上并未更新数组。
您需要使用forEach()
通过将新值分配给索引来修改原始数组。将布尔值与false
进行比较会将其反转,就好像值是false
,则false === false
将是true
,如果值是true
然后是true === false
应该是false
。
使用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)