有没有办法使用属性值/是获取 JavaScript 对象属性名称? [复制]

Posted

技术标签:

【中文标题】有没有办法使用属性值/是获取 JavaScript 对象属性名称? [复制]【英文标题】:Is there any way to get a JavaScript object's property name/s using property value/s? [duplicate] 【发布时间】:2019-11-27 05:10:20 【问题描述】:

假设我有一个这样的 javascript 对象:

var myObject = 
  key1: "value1",
  key2: "value2",
  key3: "value3"

我们都知道我可以通过使用myObject ['key1'] 得到value1,但是有什么方法可以反过来,比如myObject ["value1"] 返回'key1'

我知道我可以使用

var values = Object.values (myObject);
var index = values.indexOf ("value1");
var keys = Object.keys (myObject);
keys [index];

要做到这一点,但这只是啰嗦。我也明白,当多个键具有相同的值时,这会更加麻烦。我只是想知道是否有其他方法可以让这样的事情变得更容易。

【问题讨论】:

为什么不直接翻转键/值? 【参考方案1】:

当然,您可以遍历键并按值过滤: 值不必是唯一的,您将获得一组键。 而且您不必事先反转对象。

const obj = a: 1, b: 2;
const value = 1;
const keys = Object.keys(obj).filter(key => obj[key] === value);
console.log(keys);

【讨论】:

谢谢。当值不唯一时,这将非常有用。 如果您只需要一个值,您可以将filter 替换为find 没问题。请记住,接受的答案不适用于数值,而且速度要慢得多。【参考方案2】:

我会创建一个反转键和值的对象,然后使用普通的属性查找:

var myObject = 
  key1: "value1",
  key2: "value2",
  key3: "value3"

var reversedObj = Object.fromEntries(
  Object.entries(myObject).map(entries => entries.reverse())
);

console.log(reversedObj.value1);
console.log(reversedObj.value3);

不过,请记住,这取决于值的唯一性。

如果您需要区分字符串值和非字符串值,例如key1: 123 vs key2: '123',请改用 Map(因为普通对象只能有字符串(和符号)键,但 Map 键可以是 任何类型)

var myObject = 
  key1: 123,
  key2: "123",
  key3: "value3"

var reversedMap = new Map(
  Object.entries(myObject).map(entries => entries.reverse())
);

console.log(reversedMap.get('123'));
console.log(reversedMap.get(123));

【讨论】:

哇。谢谢你的快速反应。这正是我想要的。

以上是关于有没有办法使用属性值/是获取 JavaScript 对象属性名称? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法使用 javascript/Jquery 将未提交的输入字段的值属性作为 URL 的参数传递?

有没有办法使用反射类设置私有/受保护的静态属性?

js jQuery,有没有办法在属性中设置/获取多值?

有没有办法在 Spring Boot 中获取所有配置属性的名称?

通过属性值从对象数组中获取JavaScript对象[重复]

有没有办法从不同的 foreach 中获取值?