Предполагая, что я объявляю
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();
}