javascript - 为什么代码根据语句顺序起作用
问题描述
forEach
如果它有这个顺序,下面的工作:
series.forEach(s => {
s.color = coloresNombres[s.name.toLowerCase()][0]
s.name = coloresNombres[s.name.toLowerCase()][1]
})
但如果订单是:
series.forEach(s => {
s.name = coloresNombres[s.name.toLowerCase()][1]
s.color = coloresNombres[s.name.toLowerCase()][0]
})
问题是:为什么?
示例代码
let series = [
{
type: 'column',
name: 'Destapado',
data: [
0, 0, 0, 0,
0, 0, 0
]
},
{
type: 'column',
name: 'Guardado de carpa',
data: [
0, 0, 0, 0,
0, 0, 0
]
},
{
type: 'column',
name: 'Presacado de carpa',
data: [
0, 3, 0, 0,
0, 0, 0
]
},
{
type: 'column',
name: 'Retapado',
data: [
0, 0, 0, 0,
0, 0, 0
]
},
{
type: 'column',
name: 'Tapado',
data: [
0, 0, 0, 0,
0, 0, 0
]
}
]
let coloresNombres = {
'destapado': ['#ec7126', 'Destape'],
'guardado de carpa': ['#fe9b38', 'Guardado'],
'presacado de carpa': ['#003a81', 'Sacado'],
'retapado': ['#2fb9d5', 'Retape'],
'tapado': ['#00669e', 'Tapado']
}
series.forEach(s => {
s.name = coloresNombres[s.name.toLowerCase()][1]
s.color = coloresNombres[s.name.toLowerCase()][0]
})
解决方案
因为你正在改变s.name
.
在“工作”示例中,s.name
整个函数中的值相同,但在最后发生了更改:
series.forEach(s => {
s.color = coloresNombres[s.name.toLowerCase()][0]
s.name = coloresNombres[s.name.toLowerCase()][1]
})
但在“非工作”示例中,s.name
在第一行更改,然后在第二行使用:
series.forEach(s => {
s.name = coloresNombres[s.name.toLowerCase()][1]
s.color = coloresNombres[s.name.toLowerCase()][0]
})
既然s.name
有一个新值,s.name.toLowerCase()
就有一个新值,那么coloresNombres[s.name.toLowerCase()]
就会有一个新值,以此类推。
推荐阅读
- c++ - 私有运算符 delete 会触发 GCC 和 Clang 的编译时错误,但不会触发 MSVC
- .htaccess - 301 重定向未重定向到没有尾部斜杠的正确 URL
- scala - 从 Play Websocket 迁移到 Akka HTTP Websocket
- node.js - JHipster 应用程序在开发模式下生成消息“this.driver.matchesElement”
- amazon-web-services - 在非 Amazon Linux 映像中重新启动的 Ecs 代理
- mysql - 保存日志以再次使用它,mysql数据库
- asp.net-mvc - 使用 LINQ 和实体框架进行子查询
- wordpress - 使用自定义域登录 WordPress
- python - 想要将彩色图像附加到列表并使用 OpenCV 将该列表转换为灰度
- selenium - 我可以在 After Test 调用中获取 @Test 的变量名称和方法名称吗?