在javascript对象中;获取值属性的最佳方法
in a javascript object, what's best way to get the attribute of a value?
如果我们有一个javascript对象
var calories = { apple:200, pear:280, banana:300, peach:325 }
找到含有280卡路里热量的(第一种)水果的最佳方法是什么?
可以CCD_ 1,但应该有更好的方法。
例如,我想到了Array.prototype.indexOf()
,它对数组做同样的事情。
小心!不能保证所有浏览器都返回相同的结果。事实上他们没有。
例如:
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
显然,这里的问题是对象索引上没有"顺序"的概念,因为对象就是这样:无序映射。
使用for..in
构造的线性搜索:
var fruit = null;
for (var prop in calories) {
if (calories[prop] == 280) {
fruit = prop;
break;
}
}
但是应该有更好的方法
不,真的不应该。按照99%的用例的方式,开发人员更感兴趣的是从密钥中获得价值。
您可以扩展Object的原型:
// 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);
它也适用于普通数组:Object.getOwnPropertyNames(calories).forEach...
0,所以您也可以使用它来代替indexOf
。
记住使用三个字符运算符来检查它是否未定义:
index === undefined // to check the value/index exists
index !== undefined // to check the value/index does not exist
当然,如果您愿意,您可以更改函数的名称,并记住不要声明任何名为"undefined"的变量。
还请记住,作为indexOf,它最多会返回一个定义的键,但可能不止一个,因此在这种情况下,您将需要这样的东西(.keysOf(...)
):
// Returns all the keys of the value if it exists (an empty array if not)
Object.defineProperty(Object.prototype, "keysOf", {
value: function(value) {
var allKeys = [];
for (var key in this) if (this[key] == value) allKeys.push(key);
return allKeys;
}
});
相关文章:
- 什么'是使输入上禁用的属性与Meteor辅助对象反应的最佳方法
- 检查链接对象形式中未定义属性的最佳实践是什么
- BackboneJS重新排列集合中模型的最佳方式,同时为每个模型维护0索引的有序属性
- 复制元素的最佳方式是:只复制元素的类型和属性
- 扩展或定义新的dat.gui属性控制器的最佳方法
- 使用方法和属性定义javascript对象的最佳方法是什么?(如果可能以本机方式)
- 通用化用于切换禁用属性的代码的最佳方法
- JavaScript 中通过公共属性“交叉”两个 JSON 对象数组的最佳方式
- 添加属性/方法的明确最佳方法
- 使用 Angular JS 动态更新 jQuery UI 属性的最佳方法
- 关于在 Vue.js 中设置数据对象属性的最佳实践
- 在 JavaScript 对象文本中组织方法和属性的最佳方式
- 执行属性别名的最佳方法
- 在 IE8 中为对象中的每个属性添加附加属性的最佳方法是什么?
- jQuery中根据其数据属性包装元素的最佳方法是什么?
- 使用 javascript 实现属性-值搜索界面的最佳方法
- EmberJS:基于另一个属性重新加载控制器模型的最佳方法
- 使用jQuery命名属性的最佳模式
- 在ReactJS中重用映射循环中的属性-最佳实践
- JSON属性最佳实践