簡體   English   中英

返回值是包含與條件匹配的屬性的對象的鍵

[英]Return key of object whose value is an object that contains a property that matches a condition

我有一個對象

const CABLE_SOURCES = {
    foxnews: {
        id: "FOXNEWSW",
        name: "Fox News",
    },
    cnn: {
        id: "CNNW",
        name: "CNN",
    },
    msnbc: {
        id: "MSNBCW",
        name: "MSNBC",
    },
    abc7: {
        id: "KGO",
        name: "ABC 7 news",
    },
};

我目前的解決方案看起來像

function getKeyName(cableSourceId) {
    let source = null;
    for (let s in CABLE_SOURCES) {
        if (CABLE_SOURCES[s].id === cableSourceId) {
            source = s;
        }
        break;
    }
    return source;
}

getKeyName("FOXNEWSW")
// foxnews

是否有更實用/更優雅的方式來重寫getKeyName ,無論是使用 ES6 還是 lodash?

一種選擇是.find其值具有該id的對象條目之一。 如果找到這樣的條目,則返回其中的第一項(鍵),否則返回null

 const CABLE_SOURCES = { foxnews: { id: "FOXNEWSW", name: "Fox News", }, cnn: { id: "CNNW", name: "CNN", }, msnbc: { id: "MSNBCW", name: "MSNBC", }, abc7: { id: "KGO", name: "ABC 7 news", }, }; function getKeyName(cableSourceId) { const foundEntry = Object.entries(CABLE_SOURCES).find(([, { id }]) => id === cableSourceId); return foundEntry ? foundEntry[0] : null; } console.log(getKeyName("FOXNEWSW")); console.log(getKeyName("foo"));

我猜你可以使用Object.keys()Array.prototype.find()組合。 一旦你找到了對象,只需要訪問name屬性。

Object.keys()文檔說明:

Object.keys() 方法返回給定對象自己的可枚舉屬性名稱的數組,其順序與我們使用普通循環獲得的順序相同。

Array.prototype.find()文檔說明:

find() 方法返回提供的數組中滿足提供的測試函數的第一個元素的值。

像下面這樣:

 const CABLE_SOURCES = { foxnews: { id: "FOXNEWSW", name: "Fox News", }, cnn: { id: "CNNW", name: "CNN", }, msnbc: { id: "MSNBCW", name: "MSNBC", }, abc7: { id: "KGO", name: "ABC 7 news", }, }; const getKeyName = text => CABLE_SOURCES[Object.keys(CABLE_SOURCES).find(i => CABLE_SOURCES[i].id === text)].name; const result = getKeyName("FOXNEWSW"); console.log(result);

我希望這有幫助!

Lodash 有一個_.findKey()方法,它接受一個謂詞(在這種情況下是對象),並返回具有與謂詞匹配的值的第一個鍵:

 function getKeyName(id) { return _.findKey(CABLE_SOURCES, { id }); } const CABLE_SOURCES = {"foxnews":{"id":"FOXNEWSW","name":"Fox News"},"cnn":{"id":"CNNW","name":"CNN"},"msnbc":{"id":"MSNBCW","name":"MSNBC"},"abc7":{"id":"KGO","name":"ABC 7 news"}}; console.log(getKeyName("FOXNEWSW")); console.log(getKeyName("foo"));
 <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.15/lodash.js"></script>

暫無
暫無

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

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