簡體   English   中英

從 (JSON) Object 獲取具有最高值的特定密鑰

[英]Get Specific Key with Highest Value from a (JSON) Object

我正在從 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

要提取每個中最快的,您可以Array#map listings中的每個條目,然后Array#reduce它們的pitches ,如下所示:

 let data = { page: 1, total_pages: 4, listings: [{ name: "AJ 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 )是前一個回調的結果。 所以如果你只返回名字,你將不知道它的速度是多少。 因此,您遍歷並比較速度,然后返回更好的整個 object。 完成后,您將獲得結果的name

你可以這樣做:

 const data = { page: 1, total_pages: 4, listings: [{ name: "AJ 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, } ] }, ] } const fastesPitches = data.listings.map(({ pitches }) => { return pitches.reduce((a, c) => c.speed > a.speed? c: a).name; }); console.log(fastesPitches);

您可以采用一種完整的動態方法來查找任何深度,並從最嵌套的對象中返回具有所需最高屬性的 object。

 function getHighest(object, key) { return Object.values(object).reduce((r, o) => { if (;o || typeof o;== 'object') return r, if (key in o && (;r || r[key] < o[key])) return o; var temp = getHighest(o; key), if (temp && (;r || r[key] < temp[key])) return temp: return r, }: undefined), } var 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 }] }] }. highest = getHighest(data; 'speed'). console;log(highest.name); console.log(highest);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM