Предполагая, что я объявляю
var ad = {};
Как проверить, будет ли этот объект содержать какие-либо пользовательские свойства?
Предполагая, что я объявляю
var ad = {};
Как проверить, будет ли этот объект содержать какие-либо пользовательские свойства?
Вы можете перебрать свойства вашего объекта следующим образом:
for(var prop in ad) {
if (ad.hasOwnProperty(prop)) {
// handle prop as required
}
}
Важно использовать метод hasOwnProperty(), чтобы определить, имеет ли объект указанное свойство как прямое свойство и не унаследован от цепочки прототипов объекта.
Из комментариев: вы можете поместить этот код в функцию и заставить его возвращать false, как только он достигнет той части, где есть комментарий
Тест производительности
Test Of Object.Keys vs For..In При тестировании любых свойств
Вы можете использовать встроенный метод Object.keys, чтобы получить список ключей на объекте и проверить его длину.
var x = {};
// some code where value of x changes and than you want to check whether it is null or some object with values
if(Object.keys(x).length > 0){
// Your code here if x has some properties
}
Как сделать простую функцию?
function isEmptyObject(obj) {
for(var prop in obj) {
if (Object.prototype.hasOwnProperty.call(obj, prop)) {
return false;
}
}
return true;
}
isEmptyObject({}); // true
isEmptyObject({foo:'bar'}); // false
Вызов метода hasOwnProperty непосредственно на Object.prototype заключается только в том, чтобы добавить немного больше безопасности, представьте себе следующее, используя обычный вызов obj.hasOwnProperty(...):
isEmptyObject({hasOwnProperty:'boom'}); // false
Примечание: (для будущего) Вышеупомянутый метод опирается на оператор for...in, и этот оператор выполняет итерацию только по перечислимым свойствам, в наиболее широко распространенной в настоящее время ECMAScript Standard (3-е издание) программист не имеет возможности создавать неперечислимые свойства.
Однако теперь это изменилось с ECMAScript 5th Edition, и мы можем создавать неперечислимые, незаписываемые или не подлежащие удалению свойства, поэтому приведенный выше метод может выйти из строя, например:
var obj = {};
Object.defineProperty(obj, 'test', { value: 'testVal',
enumerable: false,
writable: true,
configurable: true
});
isEmptyObject(obj); // true, wrong!!
obj.hasOwnProperty('test'); // true, the property exist!!
Решение этой проблемы ECMAScript 5 будет:
function isEmptyObject(obj) {
return Object.getOwnPropertyNames(obj).length === 0;
}
Метод Object.getOwnPropertyNames возвращает Array, содержащий имена всех собственных свойств объекта, перечисляемых или нет, этот метод теперь реализуется поставщиками браузеров, уже на бета-версии Chrome 5 и последней версии WebKit Ночные сборки.
Object.defineProperty также доступен в этих браузерах и последних версиях Firefox 3.7 Alpha.
С помощью jQuery вы можете использовать:
$.isEmptyObject(obj); // Returns: Boolean
В jQuery 1.4 этот метод проверяет оба свойства самого объекта и свойства, унаследованные от прототипов (в том, что он не использует hasOwnProperty).
С ECMAScript 5th Edition в современных браузерах (IE9 +, FF4 +, Chrome5 +, Opera12 +, Safari5 +) вы можете использовать встроенный Object.keys метод:
var obj = { blah: 1 };
var isEmpty = !Object.keys(obj).length;
Или простой старый JavaScript:
var isEmpty = function(obj) {
for(var p in obj){
return false;
}
return true;
};
В последних браузерах (и node.js) поддерживается Object.keys(), который возвращает массив со всеми ключами в объектном литерале, чтобы вы могли сделать следующее:
var ad = {};
Object.keys(ad).length;//this will be 0 in this case
Поддержка браузера: Firefox 4, Chrome 5, Internet Explorer 9, Opera 12, Safari 5
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
Если вы используете underscore.js, вы можете использовать функцию _. isEmpty:
var obj = {};
var emptyObject = _.isEmpty(obj);
Если вы хотите использовать lodash, вы можете использовать метод some.
_.some(obj) // returns true or false
См. этот небольшой jsbin пример
for (var hasProperties in ad) break;
if (hasProperties)
... // ad has properties
Если вам нужно быть в безопасности и проверить прототипы объектов (они добавляются некоторыми библиотеками, а не там по умолчанию):
var hasProperties = false;
for (var x in ad) {
if (ad.hasOwnProperty(x)) {
hasProperties = true;
break;
}
}
if (hasProperties)
... // ad has properties
for(var memberName in ad)
{
//Member Name: memberName
//Member Value: ad[memberName]
}
Член означает свойство члена, переменную-член, все, что вы хотите назвать > _ >
Вышеприведенный код вернет ВСЕ, в том числе toString... Если вы хотите узнать, был ли расширен прототип объекта:
var dummyObj = {};
for(var memberName in ad)
{
if(typeof(dummyObj[memberName]) == typeof(ad[memberName])) continue; //note A
//Member Name: memberName
//Member Value: ad[memberName]
}
Примечание A: Мы проверяем, имеет ли элемент фиктивного объекта тот же тип, что и наш член тестируемого объекта. Если это расширение, тип элемента dummyobject должен быть "undefined"
Есть два способа сделать это:
Однако обратите внимание: между ними существует очень большая разница:
Первый возвращает true, если obj имеет свойство с именем propName (obj.propName), но если он не найдет его, он будет держать в поисках propName с помощью prototype дерево. Если он найдет его там, выражение вернет true, иначе оно вернет false.
Второй пример будет проверять только сам объект без, проверяя его прототип (ы). Это очень похоже на повторение массива.
Пример:
function Obj(){
this.a = undefined;
this.b = null;
this.c = false;
}
Obj.prototype = {
d: true,
e: true
};
var obj = new Obj();
И проверить это:
"a" in obj // true
"e" in obj // true
obj.hasOwnProperty("a") // true
obj.hasOwnProperty("e") // false
Если вы уверены, что объект является определяемым пользователем, самый простой способ определить, является ли UDO пустым, будет следующий код:
isEmpty=
/*b.b Troy III p.a.e*/
function(x,p){for(p in x)return!1;return!0};
Несмотря на то, что этот метод (по своей природе) является дедуктивным, - это самый быстрый и быстрый.
a={};
isEmpty(a) >> true
a.b=1
isEmpty(a) >> false
p.s.: ! не используйте его в определенных браузером объектах.
Поздний ответ, но некоторые структуры обрабатывают объекты как перечисляемые. Поэтому bob.js может сделать это вот так:
var objToTest = {};
var propertyCount = bob.collections.extend(objToTest).count();
var hasAnyProps = false; for (var key in obj) { hasAnyProps = true; break; }
// as of this line hasAnyProps will show Boolean whether or not any iterable props exist
Простой, работает в каждом браузере, и хотя он технически представляет собой цикл для всех ключей на объекте, он выполняет НЕ цикл через все их... либо там 0, и цикл не запускается или есть некоторые, и он ломается после первого (потому что все, что мы проверяем, есть, если есть ЛЮБОЙ... так зачем продолжать?)
Вы можете использовать следующее:
Двойной удар! поиск свойств
var a = !![]; // true
var a = !!null; // false
hasOwnProperty Это то, что я использовал:
var myObject = {
name: 'John',
address: null
};
if (myObject.hasOwnProperty('address')) { // true
// do something if it exists.
}
Однако JavaScript решил не защищать имя метода, поэтому его можно было подделать.
var myObject = {
hasOwnProperty: 'I will populate it myself!'
};
prop в myObject
var myObject = {
name: 'John',
address: null,
developer: false
};
'developer' in myObject; // true, remember it looking for exists, not value.
TypeOf
if (typeof myObject.name !== 'undefined') {
// do something
}
Однако он не проверяет значение null.
Я думаю, что это лучший способ.
в операторе
var myObject = {
name: 'John',
address: null
};
if('name' in myObject) {
console.log("Name exists in myObject");
}else{
console.log("Name does not exist in myObject");
}
результат:
Имя существует в myObject
Вот ссылка, которая более подробно описывает оператор in: Определение наличия свойства объекта
Я написал 2 компонента с открытым исходным кодом, которые могут быть полезны для этого. Если вы хотите проверить, имеет ли объект определенную пользовательскую оперу, вы можете использовать этот объект - hasOwnPropert. Примеры:
hasOwnProperty({foo: 'bar'}, 'foo') // => true
hasOwnProperty({foo: 'bar'}, 'bar') // => false
Чтобы проверить, имеет ли объект какие-либо свойства (то есть, он пуст), вы можете использовать этот объект-пустой компонент.
Примеры:
empty([]) // => true
empty({}) // => true
empty(1) // => false
empty('') // => false
empty('foo') // => true
Надеюсь, что это поможет.
Ответ очень поздний, но вот как вы могли бы справиться с прототипами.
Array.prototype.Any = function(func) {
return this.some(func || function(x) { return x });
}
Object.prototype.IsAny = function() {
return Object.keys(this).Any();
}