在javascript对象中;获取值属性的最佳方法

in a javascript object, what's best way to get the attribute of a value?

本文关键字:属性 最佳 方法 获取 javascript 对象      更新时间:2023-09-26

如果我们有一个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;
    }
});