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

时间:2016-12-09 17:07:21

标签: javascript

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

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

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

更新:感谢您提供的有用回复。我刚刚意识到我的问题可能不是一个好问题,因为对象(来自Javascript)或哈希(来自Ruby)实际上是一个无序列表,因此要求"首先匹配"声音不太好。

7 个答案:

答案 0 :(得分:1)

  

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

你进入那里的新领域:自ES2015以来,对象属性只有一个已定义的订单,然后只与某些操作相关。

在这种情况下,由于这些属性不适合数组索引的定义,并且它们都是“自己的”属性(不是继承的),它们将根据它们创建的时间顺序排列。在对象文字(如问题中的那个)中,属性是在源代码顺序中创建的,因此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引擎(无法可靠地进行polyfilled / shimmed)。
  2. 属性订单仅受某些操作的尊重(getOwnPropertynames是其中之一)。
  3. 看起来像数组索引的属性名称不会按创建顺序保留(它们按照数字顺序保留,在其他属性之前)。
  4. 继承属性显示在自己的属性之后。
  5. 警告很重要。例如,我们在这里得到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

答案 1 :(得分:1)

试试这个:

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

firstPropertyWithGivenValue(4,x);

答案 2 :(得分:0)

一个选项是循环对象。使用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);

答案 3 :(得分:0)

这是对@ 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,否则返回&#34;首先&#34;属性(请记住d出现在e之前,但例如key15将在 key7之前来到,这可能不是人们期望的那样。 / p>

答案 4 :(得分:0)

您必须遍历对象以获取其值匹配的密钥。

以下是通用函数:

逻辑:

  • Stringify对象并检查字符串中是否存在值。如果没有值,这将确保您不循环。
  • 如果存在,则循环给定对象的键。
  • 检查当前值是否为对象。如果是,请致电self并在较低级别进行搜索。由于ObjectArray都属于object类型,因此您可以将其用作通用逻辑。
  • 如果value不是对象,请直接匹配并返回密钥。

代码

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

答案 5 :(得分:-1)

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。因此,虽然有可能,但最好根据对象内部的值找到属性。

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

答案 6 :(得分:-2)

&#13;
&#13;
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;
}
}
&#13;
&#13;
&#13;