给定一个Javascript对象,我想知道是否有一种使用值返回对应属性的方法?我知道属性必须是唯一的,但值可以重复。那么也许是一种使用值返回第一个匹配属性的方法吗?
var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };
想要使用值4
来访问属性d
。
更新:感谢您的有用回复。我刚刚意识到我的问题可能不是一个好问题,因为对象(来自Javascript)或哈希(来自Ruby)实际上是一个无序列表,因此要求“首次匹配”并不是一件容易的事。
那么也许是一种使用值返回第一个匹配属性的方法吗?
您进入了一个新领域:对象属性自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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句