如何使用密钥从json中提取对象?

时间:2018-07-23 13:01:27

标签: arrays json reactjs typescript typescript2.0

我正在使用Typescript。我想迭代下面的json文件,并根据搜索字符串提取单个对象。

{
  "menus": {
    "indian": [
        {
            "id": "000123",
            "name": "Dish 1"
        },
        {
            "id": "000124",
            "name": "Dish 2"
        },
        {
            "id": "000125,
            "name": "Dish 3"
        }
    ],
    "chinese": [
        {
            "id": "000126",
            "name": "Dish 4"
        },
        {
            "id": "000127",
            "name": "Dish 5"
        },
        {
            "id": "000128",
            "name": "Dish 6"
        }
    ],
    "tandoori": [
        {
            "id": "000129",
            "name": "Dish 7"
        },
        {
            "id": "000130",
            "name": "Dish 8"
        },
        {
            "id": "000131",
            "name": "Dish 9"
        }
    ]
   }
 }

我将响应json与我的模型类映射

export interface Menu {
    indian: Item[];
    chinese: Item[];
    tabdoori: Item[];
}       

export interface Item {
    id: string;
    name: string;
}

const response: Menu = this.myApiService.getAllMenus();

例如,我的输入是“ 印度”,那么我需要从json中拉出对象

"indian": [
            {
                "id": "000123",
                "name": "Dish 1"
            },
            {
                "id": "000124",
                "name": "Dish 2"
            },
            {
                "id": "000125,
                "name": "Dish 3"
            }
        ]

我怎么能得到这个?

2 个答案:

答案 0 :(得分:2)

在TypeScript中,属性和JSON密钥不同。 getAllMenus().menus在这种情况下会给您一个错误。而是使用getAllMenus()['menus']表示法。

export interface Menu {
    indian: Item[];
    chinese: Item[];
    tabdoori: Item[];
}       

export interface Item {
    id: string;
    name: string;
}

function getMenu(response ,name){
   return response['menus'][name]
}

同步访问

如果getAllMenus返回一个对象(不是可观察到的):

const response: Menu = this.myApiService.getAllMenus();

console.log(getMenu(response, name));

异步访问

如果getAllMenus返回一个observable,并且需要订阅:

this.myApiService.getAllMenus().pipe(
  map( response : Menu => getMenu(response, name))
)
.subscribe( nameItems=> console.log(nameItems) );

输出

[
  {
    "id": "000123",
    "name": "Dish 1"
  },
  {
    "id": "000124",
    "name": "Dish 2"
  },
  {
    "id": "000125,
    "name": "Dish 3"
  }
]

答案 1 :(得分:0)

这里是一个typescript playground example,它显示相同的内容,但来自本地数据。它确实取决于getAllMenus返回的内容;我猜它是异步的,所以我们需要知道您在那里使用它是什么。