老师,这里prev.indexOf(next) == -1 && prev.push(next)没看懂。

老师,这里prev.indexOf(next) == -1 && prev.push(next)没看懂。

// 数组去重
let arr = [12, 34, 34, 342, 345, 34, 123, 345, 45, 12]
let newArr = arr.reduce((prev, next) => {
// 判断数组中是否存在当前元素,如果不存在的话,再将其添加到数组中
prev.indexOf(next) == -1 && prev.push(next)
return prev
}, []) // 设置迭代初始值为一个空数组
// 原数组不会发生改变
console.log(arr) // [12, 34, 34, 342, 345, 34, 123, 345, 45, 12]
// 去除重复项的新数组
console.log(newArr) // [12, 34, 342, 345, 123, 45]


正在回答

登陆购买课程后可参与讨论,去登陆

1回答

同学你好,reduce方法中prev是数组,next是数组当前元素。初始值prev是[],next值为12

https://img1.sycdn.imooc.com//climg/613ae3560960eb9d07700311.jpg

逻辑与中,判断数组中是否有当前值,也就是[]中没有12,prev.indexOf(next) == -1返回值为true,继续执行,prev.push(next)将12放入[]中,然后prev的值为[12] 。

继续数组中下一个值,prev值为[12] ,next值为34,prev中没有34,所以将34放入数组中。

继续下一个值,prev值为[12,34],next值为34,prev中有34,prev.indexOf(next) == -1返回值为false,逻辑与中有false就会停止,所以不执行后面的push操作。

然后继续下一个值,以此类推,最后筛选出不重复的值。

自己再理解下,祝学习愉快!

  • 老师,关于这条语句我也有疑问,

    prev.push(next) 返回的是新数组的长度,所以不可能为false,

    prev.indexOf(next) == -1 && prev.push(next),这条原代码中用 && 实际上是一种短路

    计算,是为了简写,原始形态是

    if (prev.indexOf(next) == -1) {

        prev.push(next);

    }

    可不可以这样理解?




    2022-01-24 19:03:08
  • 同学你好,这里理解没问题,很棒!祝学习愉快~

    2022-01-25 10:42:27
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师