首页 > 解决方案 > 从(JSON)对象中获取具有最高值的特定键

问题描述

我正在从 API 响应中获取数据,并尝试以最快的速度获取音高的名称。这是 API 响应的示例。

{
page: 1,
total_pages: 4,
listings: [
    {
        name: "A.J. Burnett",
        pitches: [
            {
                name: "4 Seam FB",
                speed: 96,
                control: 84,
            },
            {
                name: "Knuckle Curve",
                speed: 79,
                control: 74,
            },
            {
                name: "Sinker",
                speed: 95,
                control: 64,
            },
            {
                name: "Changeup",
                speed: 81,
                control: 44,
            }
        ]
    },
    {
        name: "Joe Smitch",
        pitches: [
            {
                name: "4 Seam FB",
                speed: 91,
                control: 82,
            },
            {
                name: "Changeup",
                speed: 69,
                control: 44,
            }
        ]
    },
]
}

这是我尝试过的:

itemSet.forEach( (item) => {
    let fastestPitch = Object.keys(item.pitches).reduce((a, b) => {
        item.pitches[a] > item.pitches[b] ? item.pitches[a].name : item.pitches[b].name
     });
});

但是,这总是返回数组中最后一个音高的名称。我正在尝试以最快的速度返回球场。

编辑:我也尝试了以下方法,但它返回错误。

itemSet.forEach( (item) => {
    let fastestPitch = Object.keys(item.pitches).reduce((a, b) => {
        item.pitches[a].speed > item.pitches[b].speed ? item.pitches[a].name : item.pitches[b].name
     });
});

错误:

(node:80698) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'speed' of undefined

标签: javascriptjson

解决方案


要提取每个中最快的,您可以像这样Array#map输入每个条目listings,然后Array#reduce输入它们的条目pitches

let data = { page: 1, total_pages: 4, listings: [{ name: "A.J. Burnett", pitches: [{ name: "4 Seam FB", speed: 96, control: 84, }, { name: "Knuckle Curve", speed: 79, control: 74, }, { name: "Sinker", speed: 95, control: 64, }, { name: "Changeup", speed: 81, control: 44, } ] }, { name: "Joe Smitch", pitches: [{ name: "4 Seam FB", speed: 91, control: 82, }, { name: "Changeup", speed: 69, control: 44, } ] }, ] };

let fastestPitches = data.listings.map(obj => {
  return obj.pitches.reduce((best, current) => {
    return best.speed > current.speed ? best : current
  }, {}).name
});

console.log(fastestPitches)

请注意,当您减少时,第一个参数 ( best,在这种情况下) 是前一个回调的结果。所以如果你只返回名字,你将不知道它的速度是多少。因此,您遍历并比较速度,然后返回更好的整个对象。完成后,您将获得name结果。


推荐阅读