根据对象内的值获取对象键

时间:2019-06-22 01:26:42

标签: javascript lodash

我正在尝试获取与某个值关联的密钥。如果我使用这个:

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 个答案:

答案 0 :(得分:1)

不幸的是,我不明白为什么return语句不起作用。但是,我可以提出解决此问题的方法:

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

我希望能有所帮助。

答案 1 :(得分:0)

也许是这样的:

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

答案 2 :(得分:0)

这个怎么样?没有lodash会为此=)

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 )

答案 3 :(得分:0)

您还可以通过Object.entriesArray.findno 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

具有lodashES5的兼容性,只需像这样使用_.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>