在响应中迭代json数据

时间:2018-08-02 08:53:31

标签: javascript node.js

我是新来使用JSON进行响应的,我需要process(iterate)来响应JSON原型,下面给出了一些JSON数据,“我要管理属于不同类别的每个房间号”,使用地图功能实现

请帮助我解决问题。 “对不起我的英语不好,英语不是我的母语。

let data = {
  "category": {
    "king": [{
        "id": 1,
        "room_no": 101,
        "price": 2000
      },
      {
        "id": 2,
        "room_no": 102,
        "price": 3000
      }
    ],
    "queen": [{
        "id": 1,
        "room_no": 101,
        "price": 2000
      },
      {
        "id": 2,
        "room_no": 102,
        "price": 3000
      }
    ]
  }
} 

3 个答案:

答案 0 :(得分:0)

似乎您想像遍历数组一样遍历对象,但是您不知道该怎么做。

查看javascript的Object.keys(),Object.values()或Object.entries()。

  • Object.keys(obj)将返回可以映射的键数组。

例如Object.keys({ foo: 1, bar: 2 }) <=> ['foo', 'bar']

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/keys

  • Object.values执行相反的操作:

Object.values({ foo: 1, bar: 2 }) <=> [1, 2]

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/values

  • 和Object.entries()都可以。

Object.entries({ foo: 1, bar: 2 }) <=> [['foo', 1],['bar', 2]]

https://developer.mozilla.org/fr/docs/Web/JavaScript/Reference/Objets_globaux/Object/entries

所以对您来说,映射对象的方法是:

Object.keys(data.category).map(function(categoryName) {
    var category = data.category[categoryName];
    category.map(function(bed) {
        console.log(
            'Category: , ', categoryName,
            ' / Bed: ', bed.id,
            ' / Room number: ', bed.room_no
        );
    });
});

Working fiddle here (remember to open the console to see the result)

答案 1 :(得分:0)

您实际上不能单独使用map来执行此操作。至少,这与通常使用standard-class的方式相反。

您可以使用多个Scoring = ((dynamic)e).Scoring is DBNull ? null : (double)(((dynamic)e).Scoring), TrustCoefficient = (dynamic)e).TrustCoefficient is DBNull ? null : (double)(((dynamic)e).TrustCoefficient), 步骤将对象转换为嵌套列表(在这种情况下为对象列表列表)。但您还需要将map的结果展平到数字列表中。看到这里:

map

首先,有三个嵌套的map步骤。前两个使用let data = { "category": { "king": [{ "id": 1, "room_no": 101, "price": 2000 }, { "id": 2, "room_no": 102, "price": 3000 } ], "queen": [{ "id": 1, "room_no": 101, "price": 2000 }, { "id": 2, "room_no": 102, "price": 3000 } ] } }; const room_nos = Object.values(data) .map(entry => Object.values(entry) .map(category => category.map(room => room.room_no))) .reduce((result, array) => result.concat(array), []) .reduce((result, array) => result.concat(array), []); console.log(room_nos);将对象转换为它们的值列表(一个用于map,一个用于Object.values)。这为您提供了房间描述符列表的列表列表(即具有datacategoryid属性的对象)。在第三步room_no中,将房间描述符投影到price属性上,以获得数字列表的列表。

第二,我们使用两个map步骤将数字列表的列表扁平化为数字列表。

输出:

room_no

更新:您可以将内部列表转换为类型为reduce的元素列表,如下所示:

[
  101,
  102,
  101,
  102
]

输出:

{ [category: string]: number }

答案 2 :(得分:0)

用于安慰 room_no

[].concat.apply([], Object.values(data["category"])).map(i => console.log(i.room_no))

输出:

101
102
101
102

Object.values(data["category"])以嵌套数组格式给出国王和王后类别的值,[].concat.apply([], [nested_array])将其展平为应用了Array.prototype.map()的单级数组

用于格式化结果,例如 category:room_no

for(key in data["category"]){
  data["category"][key].map(i => console.log(`${key} : ${i.room_no}`))
}

输出:

king : 101
king : 102
queen : 101
queen : 102

此处在data["category"]上循环并应用了Array.prototype.map()