(Заменяющий ответ, я не хотел, чтобы последний был CW.)
Проблема в том, что «кеш» - это своего рода массивОбъекты JSON
На самом деле это не массив.Это объект.(Он создается с помощью var cache = {};
, как мы можем сказать.)
... но чтобы использовать if ( input in cache ) { ... }
Мне нужно преобразовать его в простой массив javascript.
На самом деле нет.Оператор in
в этом контексте проверяет, содержит ли объект свойство с именем, которое вы ему даете.Пример:
var obj = {foo: 1}; // An object with a property called "foo"
alert('foo' in obj); // alerts true, `obj` has a "foo" property
alert('bar' in obj); // alerts false, there is no "bar" property in `obj`
Обратите внимание, что левая часть оператора in
должна быть строкой (это может быть литерал, как указано выше, или любое выражение, которое приводит к строке, например,ссылка на переменную).
Код в вашем обработчике click
принимает значение поля "inputV" и проверяет, является ли это значение именем свойства в cache
объекте.
Вы, вероятно, хотите проверить, является ли это значением одного из свойств объекта cache
.Если так:
$('#btn_check').click(function() {
var input = $("#inputV").val();
var found, propName;
alert(input);
console.log('cache='+cache);
/// FireBug says 'cache=[object Object]'
found = false;
for (propName in cache ) {
if (cache[propName] == input) {
found = true;
break;
}
}
alert(found);
});
Поскольку мы знаем, что cache
старый скучный объект (из-за того, что он создан с var cache = {};
), мы можем довольно безопасно использовать цикл for..in
, как указано выше.Но если вы хотите быть более осторожным, вы должны использовать hasOwnProperty
, чтобы убедиться, что вы проверяли только те свойства, у которых cache
имеет свою собственную копию (в отличие от тех, которые он наследует от своего прототипа):
for (propName in cache ) {
if (cache.hasOwnProperty(propName) && cache[propName] == input) {
found = true;
break;
}
}
Опять же, в этом случае это на самом деле не нужно, потому что мы знаем, что cache
- простой объект и запрещает кому-то делать что-то действительно глупое, например, расширение Object.prototype
(что Ты не должен делать), все егоперечислимые свойства (вещи, которые перечисляет for..in
) являются его собственными свойствами.