в объекте javascript, как лучше всего получить атрибут значения? - PullRequest
0 голосов
/ 29 января 2012

если у нас есть объект JavaScript

var calories = { apple:200, pear:280, banana:300, peach:325 }

Какой лучший способ найти (первый) фрукт, который содержит 280 калорий?

может Object.getOwnPropertyNames(calories).forEach..., но должен быть лучший способ.

Например, я думал о Array.prototype.indexOf(), который делает то же самое для массива.

Ответы [ 4 ]

2 голосов
/ 29 января 2012

Внимание! Нет гарантии, что все браузеры возвращают одинаковый результат. На самом деле это не так.

Например:

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

Очевидно, что проблема в том, что здесь нет понятия «порядок» в индексах объектов, потому что, в общем-то, это и есть объекты: неупорядоченные карты.

1 голос
/ 29 января 2012

Линейный поиск с использованием конструкции for..in:

var fruit = null;

for (var prop in calories) {

  if (calories[prop] == 280) {

    fruit = prop;
    break;
  }
}
1 голос
/ 29 января 2012

но должен быть лучший способ

Нет, на самом деле не должно быть.Как и в 99% случаев, разработчики больше заинтересованы в получении значения от ключа.

0 голосов
/ 28 ноября 2013

Вы можете расширить прототип 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;
    }
});

Использование этого способа вместо общего Object.prototype.keyOf = ... будет работать с jQuery, если вы его используете.

И тогда выможно использовать его так:

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 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;
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...