给定一个Javascript对象,我想知道是否有办法使用value来返回相应的属性?我理解属性必须是唯一的,但值可以复制。那么也许是一种使用value来返回第一个匹配属性的方法吗?
var x = { a: 1, b: 2, c: 3, d: 4, e: 4 };
想要使用值4
来访问属性d
。
更新:感谢您提供的有用回复。我刚刚意识到我的问题可能不是一个好问题,因为对象(来自Javascript)或哈希(来自Ruby)实际上是一个无序列表,因此要求"首先匹配"声音不太好。
答案 0 :(得分:1)
那么也许是一种使用value来返回第一个匹配属性的方法?
你进入那里的新领域:自ES2015以来,对象属性只有一个已定义的订单,然后只与某些操作相关。
在这种情况下,由于这些属性不适合数组索引的定义,并且它们都是“自己的”属性(不是继承的),它们将根据它们创建的时间顺序排列。在对象文字(如问题中的那个)中,属性是在源代码顺序中创建的,因此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
答案 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
并在较低级别进行搜索。由于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));
答案 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)
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;