我正在尝试获取与某个值关联的密钥。如果我使用这个:
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。
任何帮助都很棒!谢谢!
答案 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.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>