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