猫鼬,对象中的数组

Posted

技术标签:

【中文标题】猫鼬,对象中的数组【英文标题】:Mongoose, array in object 【发布时间】:2015-12-28 13:32:07 【问题描述】:

更新: 这个问题似乎与猫鼬有关。请参阅底部的更新。

在父级中,我使用以下代码将choosenItem 传递给孙子:

childContextTypes: 
        foo: React.PropTypes.object.isRequired,
         ,

   getChildContext: function() 
        return  foo: this.state.choosenDriver 
   ,

choosenDriver 是一个mongoose 模型,如下所示:

var Schema    = mongoose.Schema;
var driverSchema = new mongoose.Schema(

  driver: String,
  age: String,
  cars: [ type: Schema.Types.ObjectId, ref: 'Car' ]

);
module.exports = mongoose.model('Driver', driverSchema);

这很好用,在 GrandChild 中我可以执行以下操作:

contextTypes: 
      foo: React.PropTypes.object.isRequired,
  ,

//some other stuff...

render: function()
  return (
            <h1>this.context.foo.name</h1>
          )
);

这会显示choosenDriver 的名称。

我也想循环通过汽车,并认为可以这样做:

render: function()

   var cars = new Array(this.context.foo.cars);
   var driversCars = cars.map(function(car,i)
   return <li key=i> car </li>;
   );
  return (
         <div>
            <h1>this.context.foo.name</h1>
            <ul>driversCars</ul>
         </div>

  )


 );

这会在一行显示的字符串中返回所有司机汽车。 我查看了反应开发者工具,发现汽车没有定义为数组。

这可能是因为choosenDriverstate 并且不支持这种方式的数组吗?

汽车显然是存在的,但不是作为数组存在的。

关于如何在这个例子中以数组的形式访问汽车有什么想法吗?

谢谢!

更新:

在 react-Tools 中查看 this.context.foo.cars 时,我看到:

cars: 
->_proto_ :.. 
0: "4242594395935934", 
1: "3543435095340509"
etc...

cars should be an Array so I would expect to see:
cars: Array[4]

尽管在数据库中一切看起来都应该:

"cars":["5607b0747eb3eefc225aed61","5607b07a7eb3eefc225aed62","5606bf4b0e76916c1d1668b4","5607b07a7eb3eefc225aed62"]]

最后更新: 在这里他们彼此相邻我反应工具: (我有一个驱动程序列表,这表明驱动程序对象在被选中时会发生变化)

State:
choosenDriver: ..
 _v:0
 _id: "235345353453"
 name: "Roger"
 cars: 
    ->_proto_ :.. 
    0: "4242594395935934", 
   _id: undefined 


Same driver but not choosen:
drivers: array[3]
 ->0: 
 ->1: 
      _v: 0
      _id: "4242594395935934"
      cars: Array[1]

因此,当数组被选中时,它会发生一些事情。奇怪...

【问题讨论】:

React 对象可以毫无问题地处理处于其状态的数组,也许你可以在这个问题中添加 moongose 标签,我很确定问题就在那里。 您的意思是cars 不是数组还是this.context.foo.cars 不是数组? 【参考方案1】:

如果您的意思是 cars 不是您期望的数组(而不是 this.context.foo.cars)...

Array 构造函数构建一个数组,并将构造函数的每个参数作为返回数组中的一个元素。

所以,new Array([1,2,3]) 给你:[[1,2,3]]

你想要Array.from([1,2,3]),它会给你[1,2,3],这似乎就是你想要的。

https://developer.mozilla.org/en-US/docs/Web/javascript/Reference/Global_Objects/Array

但是使用您的代码,为什么不能跳过创建中间数组而直接调用this.context.foo.cars.map(...)

【讨论】:

是的,this.context.foo.cars.map(...) 是我的第一次尝试,但它返回:无法读取未定义的属性“地图”。所以我猜汽车不是上面评论所暗示的“正确”数组。 好的,这个答案当时并不适用 - 但我会留下它,因为 this.context.foo.carsundefined 而不是其他东西与你的问题非常相关 - 你应该更新详细信息,然后我将删除此答案。 谢谢,我更新了问题以更好地反映实际问题。 你试过var driversCars = [];this.context.foo.cars.forEach(function(car) driverCars.push(&lt;li key=i&gt; car &lt;/li&gt;);)。看起来 mongoosejs 提供了一个 foreach:mongoosejs.com/docs/3.7.x/docs/… 谢谢,但是这个返回不能读取未定义的属性'foreach',我想我在猫鼬中创建数组时一定犯了一个错误,因为汽车看起来不是数组。但我谢谢你。

以上是关于猫鼬,对象中的数组的主要内容,如果未能解决你的问题,请参考以下文章

猫鼬更新数组对象中的字段

猫鼬模式中的对象数组问题

如何使用猫鼬更新数组中的现有对象

增加猫鼬数组对象中的数字

批量更新猫鼬对象中的数组

如何填充数组内的对象和猫鼬中的另一个数组中的所有用户字段