在javascript对象中,什么';获取值属性的最佳方法是什么?

在javascript对象中,什么';获取值属性的最佳方法是什么?,javascript,object,attributes,Javascript,Object,Attributes,如果我们有一个javascript对象 var calories = { apple:200, pear:280, banana:300, peach:325 } 找到(第一个)含有280卡路里的水果的最佳方法是什么 可以Object.getOwnPropertyNames(卡路里).forEach…但是应该有更好的方法 例如,我想到了Array.prototype.indexOf(),它对数组做同样的事情 但应该有更好的办法 不,真的不应该。按照99%的用例的方式,开发人员更感兴趣的是从键中

如果我们有一个javascript对象

var calories = { apple:200, pear:280, banana:300, peach:325 }
找到(第一个)含有280卡路里的水果的最佳方法是什么

可以
Object.getOwnPropertyNames(卡路里).forEach…
但是应该有更好的方法

例如,我想到了
Array.prototype.indexOf()
,它对数组做同样的事情

但应该有更好的办法

不,真的不应该。按照99%的用例的方式,开发人员更感兴趣的是从键中获取值

但应该有更好的办法


不,真的不应该。按照99%的用例的方式,开发人员更感兴趣的是从键中获取值

在构造中使用
for..进行线性搜索:

var fruit = null;

for (var prop in calories) {

  if (calories[prop] == 280) {

    fruit = prop;
    break;
  }
}

construct中使用..的
线性搜索:

var fruit = null;

for (var prop in calories) {

  if (calories[prop] == 280) {

    fruit = prop;
    break;
  }
}

小心!不能保证所有浏览器返回相同的结果。事实上他们没有

例如:

var x = { a: 1, b: 1 };
delete x.a;
x.a = 1;
x.indexOf(1)
在此返回什么<代码>b
a
?事实证明,IE的属性枚举与其他浏览器不同,规范中说这很好。因此IE将返回
a
,而其他浏览器将返回
b

您可以通过调用

Object.getOwnPropertyNames(x); // IE: a,b - other browsers: b,a
Object.keys(x); // same
for (var i in x) { console.log(i); } // same

显然,这里的问题是在对象索引上没有“顺序”的概念,因为对象就是这样:无序映射。

小心!不能保证所有浏览器返回相同的结果。事实上他们没有

例如:

var x = { a: 1, b: 1 };
delete x.a;
x.a = 1;
x.indexOf(1)
在此返回什么<代码>b或
a
?事实证明,IE的属性枚举与其他浏览器不同,规范中说这很好。因此IE将返回
a
,而其他浏览器将返回
b

您可以通过调用

Object.getOwnPropertyNames(x); // IE: a,b - other browsers: b,a
Object.keys(x); // same
for (var i in x) { console.log(i); } // same

显然,这里的问题是在对象索引上没有“顺序”的概念,因为对象就是这样的:无序映射。

您可以扩展对象的原型,这样做:

// Returns one key (any) of the value if it exists, or undefined if not
Object.defineProperty(Object.prototype, "keyOf", { 
    value: function(value) {
        for (var key in this) if (this[key] == value) return key;
        return undefined;
    }
});
如果使用jQuery,使用这种方法而不是通用的
Object.prototype.keyOf=…
,将可以使用它

然后你可以这样使用它:

var myArray = {...};
var index = myArray.keyOf(value);
它也适用于普通数组:
[…]
,因此您也可以使用它来代替
indexOf

请记住使用三字符运算符检查它是否未定义:

index === undefined // to check the value/index exists    
index !== undefined // to check the value/index does not exist
当然,如果您愿意并记住不要声明任何名为“undefined”的变量,您可以更改函数的名称

还请记住,作为indexOf,它将返回最多一个定义的键,但可能不止一个,因此在这种情况下,您将需要类似以下内容(
.keysOf(…)
):


您可以通过以下方式扩展对象的原型:

// Returns one key (any) of the value if it exists, or undefined if not
Object.defineProperty(Object.prototype, "keyOf", { 
    value: function(value) {
        for (var key in this) if (this[key] == value) return key;
        return undefined;
    }
});
如果使用jQuery,使用这种方法而不是通用的
Object.prototype.keyOf=…
,将可以使用它

然后你可以这样使用它:

var myArray = {...};
var index = myArray.keyOf(value);
它也适用于普通数组:
[…]
,因此您也可以使用它来代替
indexOf

请记住使用三字符运算符检查它是否未定义:

index === undefined // to check the value/index exists    
index !== undefined // to check the value/index does not exist
当然,如果您愿意并记住不要声明任何名为“undefined”的变量,您可以更改函数的名称

还请记住,作为indexOf,它将返回最多一个定义的键,但可能不止一个,因此在这种情况下,您将需要类似以下内容(
.keysOf(…)
):


虽然我尊重你的意见,但我不敢苟同。例如,数组有indexOf(),做同样的事情,在数组中99%的时间人们都对通过索引获取值感兴趣。开发人员(我在其中工作超过35年)经常对对称属性感兴趣。一维映射和二维映射是不同的概念。javascript的对象表示一维映射。尽管我尊重你的观点,但我不同意你的看法。例如,数组有indexOf(),做同样的事情,在数组中99%的时间人们都对通过索引获取值感兴趣。开发人员(我在其中工作超过35年)经常对对称属性感兴趣。一维映射和二维映射是不同的概念。javascript的对象表示一个一维映射。您希望第一个映射正好包含280卡路里还是至少包含280卡路里?@nnnn-一个简单的反向查找。遗憾的是,没有与
.indexOf()
等效的内置函数,尽管创建一个短函数来实现它显然非常简单。目前,我推荐使用
for..in
循环,因为较旧的浏览器支持该循环。@nnnnnn-得出相同的结论:您希望第一个循环的热量正好为280卡路里还是至少为280卡路里?@nnnnnn-简单的反向查找。遗憾的是,没有与
.indexOf()
等效的内置函数,尽管创建一个短函数来实现它显然非常简单。目前,我推荐使用
for..in
循环,因为较旧的浏览器支持它。@nnnnnn-得出同样的结论,我认为您应该使用
hasOwnProperty()
在循环中过滤
prop
,这与
Object.getOwnPropertyNames()差不多
对您有帮助代码基于您的示例
对象定义,因此在这种情况下,
hasOwnProperty()
检查是不必要的。如果您希望将其放入函数中,以便在代码中的多个位置使用,您可以使用函数参数来控制是否使用
.hasOwnProperty()
或不。我认为您应该使用
hasOwnProperty()
在循环中过滤
prop
,这与
Object.getOwnPropertyNames()
为您所做的差不多。代码基于您的示例
carries
Object def