繁体   English   中英

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

[英]Javascript object: How to return property using value?

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

var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };

想要使用值4来访问属性d

更新:感谢您的有用回复。 我刚刚意识到我的问题可能不是一个好问题,因为对象(来自 Javascript)或哈希(来自 Ruby)实际上是一个无序列表,所以要求“第一个匹配”不太合理。

那么也许是一种使用 value 返回第一个匹配属性的方法?

您进入了新领域:对象属性自 ES2015 以来只有一个定义的顺序,然后仅与某些操作相关(在大多数情况下,ES2020 中的更改使该顺序甚至与过去被免除的旧操作相关) .

在这种情况下,由于这些属性不符合数组索引的定义,并且它们都是“自己的”属性(未继承),因此它们将根据创建时间排序。 在对象字面量(如您问题中的那个)中,属性是按源代码顺序创建的,因此a属性是第一个, e属性是最后一个。

但同样,此顺序仅适用于某些操作。 例如, for-inObject.keys都不能保证遵循这个顺序。 (看上面)

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

 function getFirstMatching(obj, value) { let result; Object.getOwnPropertyNames(obj).some(key => { if (obj[key] === value) { result = key; return true; // Stops the loop } }); return result; } const x = {a: 1, b: 2, c: 3, d: 4, e: 4}; console.log(getFirstMatching(x, 4)); // d

请注意,我在其中使用了其他一些 ES2015 功能( letconst 、箭头函数)。 由于不能对属性顺序进行填充/填充,因此在非 ES2015 环境中不能依赖它,所以...

请注意以下注意事项:

  1. 需要正确支持 ES2015 属性顺序的 JavaScript 引擎(不能可靠地填充/填充)。
  2. 属性顺序仅受某些操作的尊重( getOwnPropertynames就是其中之一)。
  3. 看起来像数组索引的属性名称不按创建顺序保存(它们按数字顺序保存,在其他属性之前)。
  4. 继承的属性显示在自己的属性之后。

警告很重要。 例如,这里我们得到e ,而不是d

 function getFirstMatching(obj, value) { let result; Object.getOwnPropertyNames(obj).some(key => { if (obj[key] === value) { result = key; return true; // Stops the loop } }); return result; } // Note that now e is first const x = {a: 1, b: 2, c: 3, e: 4, d: 4}; console.log(getFirstMatching(x, 4)); // e

在这里我们得到q

 function getFirstMatching(obj, value) { var result; Object.getOwnPropertyNames(obj).some(key => { if (obj[key] === value) { result = key; return true; // Stops the loop } }); return result; } // Note that now e is first const x = {i: 1, j: 2, k: 3, q: 4}; const y = {a: 1, b: 2, c: 3, d: 4, e: 4}; for (let key in y) { x[key] = y[key]; } console.log(getFirstMatching(x, 4)); // q

尝试这个:

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

firstPropertyWithGivenValue(4,x);

一种选择是在对象上循环。 使用break在第一场比赛中打破循环。

 var x = {a:1, b:2, c:3, d:4, e:4}, match; for(var i in x){ if(x[i] == 4){ match = i; break; } } console.log(match);

这是对@wscourge 的回答的轻微修改,以确保返回字典顺序中的“第一个”属性,而不需要 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;

}

如果未找到该属性,这将返回undefined ,否则它将返回“第一个”属性(请记住de之前,但例如key15key7之前,这可能不是人们所期望的)。

您将不得不遍历对象以获取其值匹配的键。

以下是一个通用函数:

逻辑:

  • 将对象Stringify并检查字符串中是否存在值。 如果值不存在,这将确保您不会循环。
  • 如果存在,循环遍历给定对象的键。
  • 检查当前值是否为对象。 如果是,调用self并在较低级别搜索。 由于ObjectArray都是object类型,您可以将其用作通用逻辑。
  • 如果 value 不是对象,则直接匹配并返回 key。

代码

 function searchValueInObj(obj, searchValue){ if(!isAvailable(obj, searchValue)) return; for(var k in obj){ if(!obj.hasOwnProperty(k)) continue; let o = obj[k]; if(typeof(o) === "object" && isAvailable(o, searchValue)){ return searchValueInObj(o, searchValue) } else if(o === searchValue) return k; } } function isAvailable(obj, searchVal){ return JSON.stringify(obj).indexOf(searchVal) > -1 } var x = {a:1, b:2, c:3, d:4, e:4, f: { g: 5, h:{i:6, j:{k: 7, l:4}}}}; console.log(searchValueInObj(x,4)); console.log(searchValueInObj(x,5)); console.log(searchValueInObj(x,7));

for (let item in x) {
    if (x[item] === 4){
        return item
    }
}

这将在您的原因中返回d ,但有一个非常大的缺陷,如果对象的顺序发生变化,那么您最终可能会得到不同的结果。

var x = {a:4, b:2, c:3, d:4, e:4};

在此对象上使用上面的代码段将导致返回a而不是d 因此,虽然有可能,但根据对象内部的值查找属性可能不是最好的方法。

你在什么情况下使用这个? 可能有更可靠的方法来获得您正在寻找的结果。

 var x = {a:1, b:2, c:3, d:4, e:4}; var re=4; for(var a in x) { if(x[a]==re){ console.log(a); break; } }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM