Получить ключ объекта на основе значения внутри этого объекта - PullRequest
2 голосов
/ 22 июня 2019

Я пытаюсь получить ключ, связанный с определенным значением. Если я использую это:

function findKpiAttrName (obj, value) {
  _.each(obj, function (v, k) {
    if (v.hasOwnProperty('name') && v.name === value) { return k }
  });
}

var attrKey = findKpiAttrName(obj, 'KPI Name');

Если я console.log(attrKey) возвращает undefined, но я знаю, что он что-то находит, потому что если я console.log(k) внутри вышеописанного метода, он печатает это просто отлично. Что-то не так с областью, которую мне не хватает? Кстати, я использую ES5.

Любая помощь с великим! Спасибо!

Ответы [ 4 ]

1 голос
/ 22 июня 2019

К сожалению, я не понимаю, почему оператор return не работает. Тем не менее, я могу предложить способ, которым я бы сделал этот вопрос:

function findKpiAttrName (obj, value) {
  let keys = Object.keys(obj);
  return keys.find(function (key) {
    if (obj[key] === value) return true;
  })
}

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

0 голосов
/ 22 июня 2019

Вы также можете добавить одну строку через Object.entries и Array.find и no lodash:

let obj = { name: 'KPI Name', value: 42 }

let fn = (o, i) => (Object.entries(o).find(([k,v]) => v === i) || [])[0]

console.log(fn(obj, 'KPI Name'))  // name
console.log(fn(obj, 42))          // value
console.log(fn(obj, null))        // undefined

При совместимости с lodash и ES5 просто используйте _. FindKey вот так:

let obj = { name: 'KPI Name', value: 42 }

let getKeyByValue = (obj, value) => _.findKey(obj, x => x === value)

console.log(getKeyByValue(obj, 'KPI Name'))  // name
console.log(getKeyByValue(obj, 42))          // value
console.log(getKeyByValue(obj, null))        // undefined
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.11/lodash.min.js"></script>
0 голосов
/ 22 июня 2019

Как насчет этого? Для этого не нужно лодаш =)

function findKpiAttrName(object, value) {
    return Object.keys(object).filter(function(key) {
        return object[key] === value;
    }).pop();
};

console.log(findKpiAttrName({
    name: 'KPI Name',
    value: 42
}, 'KPI Name'));

Мне нравится @Dementic краткое решение выше, но .find() не будет работать в IE9, если это все еще вызывает беспокойство ... это решение должно (я думаю = D, может быть ... это IE в конце концов)

0 голосов
/ 22 июня 2019

Может быть, что-то вроде этого:

function findKpiAttrName (obj, value) {
  let d = null;
  _.each(obj, function (v, k) {
    if (v.hasOwnProperty('name') && v.name === value) { d = k; return false; }
  });
  return d;
}

Или, может быть, это даже лучше:

function findKpiAttrName(obj, value) {
  for (let [k, v] of Object.entries(obj)) {
    if ( v.hasOwnProperty('name') && v.name === value) {
      return k;
    }
  }
}
...