【问题标题】:How does a .map works?.map 是如何工作的?
【发布时间】:2021-12-25 07:40:57
【问题描述】:

我正在尝试使用地图删除一些信息以保存所有选定的值,然后按删除,所有内容都应该被删除,但是当我选择所有这些值时我只做 1,我做错了什么?

librosData.filter((x) =>
selectedIDs.has(x.id)).map( x => {
 console.log(x.id)
 let tempLibrosData = librosData;
 tempLibrosData = tempLibrosData.filter(e => e.id != x.id)
 console.log(tempLibrosData)
}

这就是控制台带来的功能:

如您所见,它带回了 3 个 ID,但是当我过滤这些 ID 时,它只删除了 3 个中的 1 个?我很困惑不应该全部删除吗?

更多洞察

我有一个本地存储

const data = JSON.parse(window.localStorage.getItem("verpedidos"))

这个变量包含一堆信息:

我只想修改信息里面的变量,也就是数据。

我将信息传递给另一个变量,这样我就可以修改它而不影响其他任何东西

这是let librosData = data[0].data

然后是选择过程->

librosData.filter((x) => //where x is the row I have select
selectedIDs.has(x.id)).map( x => { // checks if such id is in the map
console.log(x.id)   //shows all ids
let tempLibrosData = librosData; // variable = data
tempLibrosData = tempLibrosData.filter(e => e.id != x.id) // filter items that match the row.id 
console.log(tempLibrosData) //render the new list of items

【问题讨论】:

  • 您能否修复代码中的语法错误。它目前不解析,解决它的方法很重要——即,.has(x.id)) 在那里做什么?
  • @Andy 我遇到的问题比我问的要复杂一些,我问的确实是问题的一部分,但不是全部。我已经分开问了,因为每个问题都是不同的问题。与 firebase + DataGrid + localStorage 是一回事,我正在慢慢实现。
  • 但是您的问题是“所有内容都应该被删除”。你真的仍然需要写一个minimal reproducible example 以便我们可以帮助你。 Here's a how to guide for creating working React snippets。您需要提出正确的问题(输入、代码、预期输出),否则我们只会猜测,而这不是本网站的运作方式。
  • 您是否在使用复选框,然后选择它们,点击删除,并且您希望数据中代表这些项目的对象被删除,组件被更新,但保存那些没有的检查了吗?
  • 请阅读我的回答。您永远不会在每次迭代时保存 librosData 的值。因此,每次过滤时,都会再次过滤原始数组。

标签: javascript arrays reactjs


【解决方案1】:

map() 函数用于遍历数组并操作或更改数据项。在 React 中,map() 函数最常用于将数据列表呈现到 DOM。 - https://www.pluralsight.com/guides/how-to-use-the-map()-function-to-export-javascript-in-react

您不应该在您所描述的情况下使用地图。您可以简单地使用过滤器而不是将其嵌套在地图中。

从 librosData 中删除 selectedIDs 数组中的 libros:

const remainingLibros = librosData.filter(libro => !selectedIDs.has(libro.id))

如果 librosData 是一个反应状态变量:

setLibrosData(prevState => prevState.filter(libro => !selectedIDs.has(libro.id))

编辑: 如果您想知道您的特定代码发生了什么,而不是您应该如何实现您想要的功能:

map 函数遍历数组中的每个项目并执行您在该项目上提供的逻辑。在每次迭代中,您都通过新值过滤 librosData,但您永远不会更新 librosData 的值,因此您所做的过滤永远不会在下一个过滤器之前保存。这就是为什么控制台日志总是返回一个包含 2 个值的数组。

【讨论】:

  • selectedIDsSet。它没有includes。它应该是 OP 使用的 has
  • 哦,所以它会一一完成,我知道为什么我会同时完成所有这些操作
  • 我的意思是当我将删除功能与所有删除代码和内容一起使用时,当我选择一个并逐个删除时它会起作用,但如果我选择所有这些(是一个复选框)然后我删除它只会删除第一个,如果我再次点击删除它只会删除下一个。
  • 设法让它工作,感谢您的建议。没有它就不会这样做
【解决方案2】:

map() 方法创建一个新数组,其中填充了对调用数组中的每个元素调用提供的函数的结果。

【讨论】:

    【解决方案3】:

    The map() method creates a new array populated with the results of calling a provided function on every element in the calling array.

    您的地图正在按照您认为的方式处理数据,但是您并没有将新返回的数组保存在任何地方。我根据您的代码和描述假设您想更改原始数组,因此您可以执行以下操作:

    selectedIDs = selectedIDs.has(x.id)).map( x => {
     console.log(x.id)
     let tempLibrosData = librosData;
     tempLibrosData = tempLibrosData.filter(e => e.id != x.id)
     console.log(tempLibrosData)
    }
    

    根据 has(x.id) 的用途,这可能并不完全有效,但希望你能明白要点。

    【讨论】:

    • selectedIDs 可能是Sethas 返回一个布尔值。您的代码有语法错误,map 回调仍然没有返回任何内容。 OP 可能只是想从 librosData 中过滤出 ID 在 selectedIDs 中的对象。
    猜你喜欢
    • 2016-06-24
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多