[英]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-in
和Object.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 功能( let
、 const
、箭头函数)。 由于不能对属性顺序进行填充/填充,因此在非 ES2015 环境中不能依赖它,所以...
请注意以下注意事项:
getOwnPropertynames
就是其中之一)。 警告很重要。 例如,这里我们得到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
,否则它将返回“第一个”属性(请记住d
在e
之前,但例如key15
将在key7
之前,这可能不是人们所期望的)。
您将不得不遍历对象以获取其值匹配的键。
以下是一个通用函数:
Stringify
并检查字符串中是否存在值。 如果值不存在,这将确保您不会循环。self
并在较低级别搜索。 由于Object
和Array
都是object
类型,您可以将其用作通用逻辑。 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.