前端问题 为什么我的 fliter 能改变原数组?网上全部都是 filter 不改变原数组....

2022-05-25 09:18:35 +08:00
 particlec

const [selectProductKey, setSelectProductKey] = useState([]);

// 搜索框 key 匹配数组 productKey const matchProductKey = key => { let temporaryArr = [...productKeyArr]; temporaryArr.filter(obj => obj.slice(key) !== -1); setSelectProductKey(temporaryArr); };

onSearch={e => {matchProductKey(e);}}

// 这里的 selectProductKey 数组确实被筛选了 {selectProductKey.map(key => (<Select.Option value={key}>{key}</Select.Option>))}

2833 次点击
所在节点    问与答
27 条回复
stillsilly
2022-05-25 17:11:43 +08:00
filter 改不改变原数组,要看你代码的写法。
一般正常的用法是,返回一个新数组,不改变原数组。
但是如果你在函数里写了有副作用的语句,比如 item.name = item.name + 111 、用了有副作用的 api push pop shift unshift reverse sort splice 之类的,那原数组当然改变了。
filter 只是做一次循环迭代而已,跟 for 循环 forEach 循环 map 类似,你在 for 循环里也可以只做读操作,那就没有改原数组。也可以有写的操作,就改了原数组……
stillsilly
2022-05-25 17:16:35 +08:00
stillsilly
2022-05-25 17:24:40 +08:00
temporaryArr.filter(obj => obj.slice(key) !== -1)
这一句没有改原数组,slice 没有副作用


如果你的数组变了,应该是其它地方改的
robinlovemaggie
2022-05-25 22:50:49 +08:00
分明是你在某处改了 productKeyArr ,却把锅甩给 filter ,非要给你看下 filter 的源码实现你才相信吗?
https://imgur.com/5S9lZ8c
ciaoly
2022-05-25 23:58:54 +08:00
@stillsilly 这个图里的测试代码是不是少打了一个等号?
particlec
2022-05-26 08:34:53 +08:00
全部相关的代码已经在三楼了,selectProductKey 的值只在三楼 setSelectProductKey 处改变过,,temporaryArr 就是一个 string[]结构,我已经打印了 temporaryArr 原数组没有改变
stillsilly
2022-05-26 09:49:01 +08:00
@ciaoly
没有啊,就是想改 item. name 的值,给它重新赋值一下

这种写法不好,codereview 要被骂死的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/855112

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX