有什么方法可以使用 属性 value/s 获取 JavaScript 对象的 属性 name/s 吗?

Is there any way to get a JavaScript object's property name/s using property value/s?

假设我有一个像这样的 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];

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

我会制作一个颠倒键和值的对象,然后使用普通的 属性 查找:

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

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

如果您需要区分字符串值和 non-string 值,例如 key1: 123key2: '123',请改用 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));

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

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