【问题标题】:How can I check if javascript array already contains a specific array如何检查 javascript 数组是否已包含特定数组
【发布时间】:2021-05-03 10:10:27
【问题描述】:

我学习 Javascript 并阅读并理解 includes 如何测试数组中是否存在值。

当我有一个如下所示的项目数组时,我的问题就出现了:

state = { focused: null, files: [] };:

图片在这里显示:

当我添加一个新的newFile 时,它不应该添加它,但它应该是评估,

if (newFile && !files.includes(newFile)) {.. 总是说 false 那么如何测试这个我是否必须测试 newFiles 中的单个值?

【问题讨论】:

标签: javascript arrays reactjs include


【解决方案1】:

Array.includes 不会在对象之间做深度比较,只会比较浅的比较引用。这样即使具有相同值的对象也会在测试中失败,因为它们具有不同的引用。

在您的情况下,您可以比较 id,它对于每个对象应该是唯一的。您可以使用Array.every 检查所有值是否通过测试。这样您就想检查每个文件 id 是否与 newFile id 不匹配:

if (newFile && files.every(({id}) => newFile.id !== id))

【讨论】:

  • 是的,谢谢,我正在从 Google Drive 或本地文件系统加载文件,用户可以添加文件,因此必须找到唯一的 ID。文件名是不够的,最好创建一个文件哈希和,是否可以在 React 中做顺便说一句,在厄运中
  • 你的意思是在 React 中创建一个哈希?我会说您可以根据需要选择合适的库来安装在您的项目中以生成哈希。 React 是一个灵活的库,它不会强制你使用其中一个。最后,它将搜索一些 github 存储库并看到“是的,这很适合我的需求”
  • 嗯,当我添加 if (newFile && files.every(({id}) => newFile.id !== id)) 时,当我调试时,我看不到 id 是什么。好像什么都没有。 list 数组包含 newFile 类型的对象所以我尝试了 if (newFile && files.every(({id}) => newFile.id !== id.id )) 但这也不起作用。也许必须为此创建一个新的 SO 问题
  • files.every((file) => newFile.id !== file.id )) 。我用{id}从文件中提取了id。如果您想访问文件,请不要像我那样提取 id
  • 奇怪,我什至更改为像if (files.every((file) => newFile.size !== file.size )){ 这样的测试文件大小,即使文件相同,它也只是给真..hmm 必须创建一个 Codesandbox `
【解决方案2】:

Array.includes 对 Array 或 Object 进行引用比较,因此您可以使用 Array.filter

if (newFile && newFile.filter(e => { /*Comparison logic */ }).length > 0) 

【讨论】:

    猜你喜欢
    • 2015-06-24
    • 2016-02-04
    • 1970-01-01
    • 2020-07-15
    • 1970-01-01
    • 2020-11-13
    • 2022-08-18
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多