在Javascript

时间:2015-08-17 20:22:02

标签: javascript arrays node.js mongoose

我从MongoDB请求中收到一个对象。 以下是它的片段:

{
    "Kost": "Kost1",
    "Name": "Name1",
    "inventar": [
            {
                "data": "A",
                "name": "thefirst",
                "ean": "802.0165.813",
            },
            {
                "ean": "802.6725.277",
                "name": "thesecond",
                "data": "B",
            },
            {
                "ean": "570.6761.483",
                "name": "thethird",
                "data": "C",
            },
            {
                "ean": "570.6764.519",
                "name": "thefourth",
                "data": "D",
            }
        ]
    }

稍后,我将使用以下代码在Jade中创建一个表:

table(border='1', cellspacing='3', cellpadding='4')
   tr
    th(align='center') ean
    th(align='center') name
    th(align='center') data
   each obj in inventar
    tr
    each val in obj
      td=  val

问题是,数组“inventar”中的对象没有排序。该表结构错误。该表的当前输出如下:

|ean         |   name                 | data
--------------------------------------------
|802.0165.813|  thefirst              |     A
|B           |  thesecond             | 802.6725.277
|C           |  thethird              | 570.6761.483
|D           |  thefourth             | 570.6764.519

第一列必须是ean,第二列必须是名称,第三列必须是数据。只有第一行是正确的。我认为这很幸运。

可以在迭代之前对Array中的对象(“inventar”)进行排序,以获得正确的结构吗? 我在某地读过,不可能直接在mongoose中排序。

提前致谢

1 个答案:

答案 0 :(得分:2)

您似乎在询问对象中的属性顺序。在ES5及更早版本中,属性按规范没有确定性顺序。有一些实现将维护属性的创建顺序,但这并不能保证。

在ES6中,规范已更改为表示属性将按创建顺序保留。但是,没有机制可以对现有对象重新排序属性。如果要更改顺序,则解决方法是创建新对象,按所需顺序复制属性,然后用新对象替换原始对象。

所有这一切,正常编码不应该关心属性的顺序。你在x.inventar[0].data中引用对象上的属性,data是第一个还是最后一个都无关紧要转储对象内容时的属性。

鉴于您在示例表中显示的内容,似乎某些代码正在抓取第一个属性并将其放在第一列中。这是构建表的错误方法。相反,它应该获取一个特定的属性名称,然后对象上的属性顺序无关紧要。所以,我认为您需要做的是修复您的玉器定义以引用特定的属性名称,而不是按顺序将它们接受。

我自己并不了解Jade,但我认为你可以这样做:

table(border='1', cellspacing='3', cellpadding='4')
   tr
    th(align='center') ean
    th(align='center') name
    th(align='center') data
   each obj in inventar
    tr
      //edited syntax
      td= obj.ean
      td= obj.name
      td= obj.data