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]的确有值。 请大神帮忙看下是什么原因?


7 回复

你的 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

解释

  1. 初始化数组obj.list 初始化为空数组。
  2. 条件赋值:如果 r 存在,将 r.list 赋值给 obj.list
  3. 确保数组长度:使用 while 循环确保 obj.list 至少有 pos + 1 个元素。如果当前数组长度小于等于 pos,则通过 push 方法添加空对象。
  4. 赋值:现在你可以安全地对 obj.list[pos] 进行赋值。

这样,无论 pos 是什么值,obj.list 都会包含足够的元素,从而避免了赋值错误。

[@jysperm](/user/jysperm) 确定有值 在页面通过post方式传递过来,打印出来有值

你还要检查一下 pos 是否是数值格式

[@jysperm](/user/jysperm) 还是不行,我强制使用Number转换最后结果还是一样,obj.list[pos]可以打印出目标值,但是在最后的obj.list依然没有新添加的项

[@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

解释

  1. 复制数组:使用 r.list.slice() 复制数组以避免修改原始数据。
  2. 确保数组长度:通过循环检查 obj.list 的长度是否足够,如果不足够,则使用 push(null) 方法填充空值,直到数组长度满足要求。
  3. 赋值操作:在确认数组长度足够之后,直接使用 obj.list[pos] 进行赋值。

通过这种方式,可以确保即使使用变量 pos 作为索引,也能正确地完成数组赋值操作。

回到顶部