Nodejs中coffeescript对象数组赋值的问题
Nodejs中coffeescript对象数组赋值的问题
Dict.findOne {key:‘recommend’},(err,r)->
pos=req.body.position
obj={}
obj.list = []
if r
obj.list=r.list
obj.list[pos]=
cover: req.body.cover
id: req.body.id
type: req.body.type
console.log “================================”,obj.list[pos]
console.log “********************************”,obj.list
console.log “--------------------------------”,obj
现有如上代码,如果将pos替换为具体数值,例如4,则在obj.list中可以发现新添加的元素,但是采用变量的方式则无法赋值,在这样的情况下obj.list[pos]的确有值。 请大神帮忙看下是什么原因?
你的 pos 是哪来的,确定有值么? 另外使用 coffee 的时候遇到问题,最好先看一下编译后的 js
在 Node.js 中使用 CoffeeScript 编写代码时,可能会遇到一些常见的问题,特别是在处理对象数组的赋值时。根据你提供的代码片段,看起来你在尝试向 obj.list
数组中的某个位置添加一个对象。让我们逐步分析并解决这个问题。
代码分析
Dict.findOne {key:'recommend'}, (err, r) ->
pos = req.body.position
obj = {}
obj.list = []
if r
obj.list = r.list
obj.list[pos] =
cover: req.body.cover
id: req.body.id
type: req.body.type
console.log "================================", obj.list[pos]
console.log "********************************", obj.list
console.log "--------------------------------", obj
问题描述
当直接给 obj.list[4]
赋值时,可以成功添加新的对象。但是当你使用变量 pos
作为索引时,似乎无法正确赋值。
原因分析
问题可能出在 obj.list[pos]
的赋值方式。在 JavaScript/ CoffeeScript 中,当你尝试访问一个不存在的数组索引时,它不会自动创建该索引。因此,如果你直接对不存在的索引进行赋值,数组将不会扩展到那个位置。
解决方案
为了确保数组能够扩展到指定的位置,你需要先检查 obj.list
是否为空,然后使用 Array.prototype.push
方法来动态地添加元素,或者显式地设置数组长度。
示例代码
Dict.findOne { key: 'recommend' }, (err, r) ->
pos = req.body.position
obj = {}
obj.list = []
if r
obj.list = r.list
# 确保 obj.list 至少有 pos+1 个元素
while obj.list.length <= pos
obj.list.push {}
# 现在可以安全地赋值
obj.list[pos] =
cover: req.body.cover
id: req.body.id
type: req.body.type
console.log "================================", obj.list[pos]
console.log "********************************", obj.list
console.log "--------------------------------", obj
解释
- 初始化数组:
obj.list
初始化为空数组。 - 条件赋值:如果
r
存在,将r.list
赋值给obj.list
。 - 确保数组长度:使用
while
循环确保obj.list
至少有pos + 1
个元素。如果当前数组长度小于等于pos
,则通过push
方法添加空对象。 - 赋值:现在你可以安全地对
obj.list[pos]
进行赋值。
这样,无论 pos
是什么值,obj.list
都会包含足够的元素,从而避免了赋值错误。
[@jysperm](/user/jysperm) 确定有值 在页面通过post方式传递过来,打印出来有值
你还要检查一下 pos 是否是数值格式
[@jysperm](/user/jysperm) 多谢兄弟帮忙了,已经解决问题了。把所有变量都打印出来了才发现req.body.position undefined,仔细检查发现是前端发送ajax请求的时候 将数据体内的属性position写错为postition!!!逗比了。
从你的描述来看,问题可能出在CoffeeScript对数组赋值的操作上。在CoffeeScript中,数组赋值需要确保数组已经被正确初始化,并且索引位置也已经存在。根据你的代码,当使用变量pos
作为索引时,可能由于数组长度不足导致赋值不成功。
示例代码
你可以尝试先确保数组的长度足够,然后再进行赋值:
Dict.findOne { key: 'recommend' }, (err, r) ->
pos = req.body.position
obj = {}
obj.list = []
if r
obj.list = r.list.slice() # 使用 slice 复制数组,防止修改原数组
# 确保数组长度足够
while obj.list.length <= pos
obj.list.push null
# 赋值操作
obj.list[pos] =
cover: req.body.cover
id: req.body.id
type: req.body.type
console.log "================================", obj.list[pos]
console.log "********************************", obj.list
console.log "--------------------------------", obj
解释
- 复制数组:使用
r.list.slice()
复制数组以避免修改原始数据。 - 确保数组长度:通过循环检查
obj.list
的长度是否足够,如果不足够,则使用push(null)
方法填充空值,直到数组长度满足要求。 - 赋值操作:在确认数组长度足够之后,直接使用
obj.list[pos]
进行赋值。
通过这种方式,可以确保即使使用变量 pos
作为索引,也能正确地完成数组赋值操作。