Javascript对象:如何使用值返回属性?

Javascript对象:如何使用值返回属性?,javascript,Javascript,给定一个Javascript对象,我想知道是否有方法使用value返回相应的属性?我知道属性必须是唯一的,但值可以重复。那么,是否有一种方法可以使用value返回第一个匹配的属性 var x = { a: 1, b: 2, c: 3, d: 4, e: 4 }; 要使用值4访问属性d 更新:感谢您的帮助回复。我刚刚意识到我的问题可能不是一个好问题,因为object(来自Javascript)或hash(来自Ruby)实际上是一个无序的列表,所以要求“第一次匹配”并不十分合理 那么,是否有一种方

给定一个Javascript对象,我想知道是否有方法使用value返回相应的属性?我知道属性必须是唯一的,但值可以重复。那么,是否有一种方法可以使用value返回第一个匹配的属性

var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };
要使用值
4
访问属性
d

更新:感谢您的帮助回复。我刚刚意识到我的问题可能不是一个好问题,因为object(来自Javascript)或hash(来自Ruby)实际上是一个无序的列表,所以要求“第一次匹配”并不十分合理

那么,是否有一种方法可以使用value返回第一个匹配的属性

var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };
您进入了新的领域:自ES2015年以来,对象属性只有一个定义的顺序,然后仅与某些操作相关(ES2020中的a使该顺序甚至与以前豁免的旧操作相关,在大多数情况下)

在本例中,由于这些属性不符合数组索引的定义,并且它们都是“自己的”属性(不是继承的),因此它们的顺序将基于创建它们的时间。在对象文字中(如您问题中的文字),属性是按源代码顺序创建的,因此
a
属性是第一个,而
e
属性是最后一个

但同样,这个顺序只适用于某些操作。例如,in的
对象的
键都不能保证遵循此顺序。(见上文)

但是
Object.getOwnPropertyNames
是。因此,要找到第一个匹配的属性,我们可以使用
Object.getOwnPropertyNames
获取一个数组,然后获取值与目标匹配的第一个属性(
4
):

函数getFirstMatching(obj,值){
让结果;
Object.getOwnPropertyNames(obj).some(key=>{
if(obj[键]==值){
结果=键;
return true;//停止循环
}
});
返回结果;
}
常数x={a:1,b:2,c:3,d:4,e:4};
console.log(getFirstMatching(x,4));//d
那么,是否有一种方法可以使用value返回第一个匹配的属性

var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };
您进入了新的领域:自ES2015年以来,对象属性只有一个定义的顺序,然后仅与某些操作相关(ES2020中的a使该顺序甚至与以前豁免的旧操作相关,在大多数情况下)

在本例中,由于这些属性不符合数组索引的定义,并且它们都是“自己的”属性(不是继承的),因此它们的顺序将基于创建它们的时间。在对象文字中(如您问题中的文字),属性是按源代码顺序创建的,因此
a
属性是第一个,而
e
属性是最后一个

但同样,这个顺序只适用于某些操作。例如,in的
对象的
键都不能保证遵循此顺序。(见上文)

但是
Object.getOwnPropertyNames
是。因此,要找到第一个匹配的属性,我们可以使用
Object.getOwnPropertyNames
获取一个数组,然后获取值与目标匹配的第一个属性(
4
):

函数getFirstMatching(obj,值){
让结果;
Object.getOwnPropertyNames(obj).some(key=>{
if(obj[键]==值){
结果=键;
return true;//停止循环
}
});
返回结果;
}
常数x={a:1,b:2,c:3,d:4,e:4};

console.log(getFirstMatching(x,4));//d
一个选项是在对象上循环。使用
break
在第一次匹配时中断循环

var x={a:1,b:2,c:3,d:4,e:4}, 匹配; 对于(x中的变量i){ 如果(x[i]==4){ match=i; 打破 } }
控制台日志(匹配)一个选项在对象上循环。使用
break
在第一次匹配时中断循环

var x={a:1,b:2,c:3,d:4,e:4}, 匹配; 对于(x中的变量i){ 如果(x[i]==4){ match=i; 打破 } } 控制台日志(匹配)请尝试以下操作:

function firstPropertyWithGivenValue(value, object){
   for(var key in object) {
     if(object[key] === value) return key;
   }
   return false;
}

firstPropertyWithGivenValue(4,x);
试试这个:

function firstPropertyWithGivenValue(value, object){
   for(var key in object) {
     if(object[key] === value) return key;
   }
   return false;
}

firstPropertyWithGivenValue(4,x);
这将在您的原因中返回
d
,但是有一个相当严重的缺陷,如果对象的顺序发生变化,那么您可能会得到不同的结果

varx={a:4,b:2,c:3,d:4,e:4}

在该对象上使用上述代码将导致返回
a
,而不是
d
。因此,虽然这是可能的,但基于对象内的值查找属性可能不是最好的

你在什么情况下使用这个?也许有一种更可靠的方法可以得到你想要的结果

这将在您的原因中返回
d
,但是有一个相当严重的缺陷,如果对象的顺序发生变化,那么您可能会得到不同的结果

varx={a:4,b:2,c:3,d:4,e:4}

在该对象上使用上述代码将导致返回
a
,而不是
d
。因此,虽然这是可能的,但基于对象内的值查找属性可能不是最好的

你在什么情况下使用这个?可能有一种更可靠的方法来获得您想要的结果。

varx={a:1,b:2,c:3,d:4,e:4};
var-re=4;
对于(x中的变量a)
{
如果(x[a]==re){
控制台日志(a);
打破
}
}
varx={a:1,b:2,c:3,d:4,e:4};
var-re=4;
对于(x中的变量a)
{
如果(x[a]==re){
控制台日志(a);
打破
}

}
这是对@wscourge答案的一个轻微修改,以确保返回字典顺序中的“first”属性,而无需ES2015

它还允许定制“属性顺序”,如果需要的话

function firstPropertyWithGivenValue(value, object) {
   var ret = undefined; 
   for (var key in object) {
       // To ignore inherited properties:
       // if (object.hasOwnProperty(key)) {
       if (object[key] == value) {
           if ((undefined === ret) || (key < ret)) {
               ret = key;
           }
       }
       // }
   }
   return ret;
函数firstPropertyWithGivenValue(值,对象){
var-ret=未定义;
for(对象中的变量键){
//要忽略继承的属性,请执行以下操作:
//if(object.hasOwnProperty(key)){
if(对象[键]==值){
如果((未定义