Возвращает ключ объекта, значение которого является объектом, который содержит свойство, соответствующее условию - PullRequest
0 голосов
/ 05 января 2020

У меня есть объект

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, либо Loda sh

Ответы [ 3 ]

0 голосов
/ 05 января 2020

Полагаю, вы можете использовать комбинацию Object.keys() и Array.prototype.find(). Когда у вас есть найденный объект, вам просто нужно получить доступ к свойству name.

Object.keys() состояния документации:

Метод Object.keys () возвращает массив заданного Именуемые имена собственных объектов объекта, в том же порядке, в котором мы получаем обычную l oop.

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);

Надеюсь, это поможет!

0 голосов
/ 05 января 2020

Loda sh имеет метод _.findKey(), который принимает предикат (в данном случае объект) и возвращает 1-й ключ со значением, соответствующим предикату:

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>
0 голосов
/ 05 января 2020

Один из вариантов - .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"));
...