개체가 비어 있습니까? [복제]
이 질문에는 이미 답변이 있습니다.
- 빈 JavaScript 객체를 테스트하려면 어떻게합니까? 답변 44 개
개체가 비어 있는지 확인하는 가장 빠른 방법은 무엇입니까?
이것보다 빠르고 좋은 방법이 있습니까?
function count_obj(obj){
var i = 0;
for(var key in obj){
++i;
}
return i;
}
비워 두면 "자체의 속성이 없음"을 의미 한다고 가정합니다 .
// Speed up calls to hasOwnProperty
var hasOwnProperty = Object.prototype.hasOwnProperty;
function isEmpty(obj) {
// null and undefined are "empty"
if (obj == null) return true;
// Assume if it has a length property with a non-zero value
// that that property is correct.
if (obj.length > 0) return false;
if (obj.length === 0) return true;
// If it isn't an object at this point
// it is empty, but it can't be anything *but* empty
// Is it empty? Depends on your application.
if (typeof obj !== "object") return true;
// Otherwise, does it have any properties of its own?
// Note that this doesn't handle
// toString and valueOf enumeration bugs in IE < 9
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
}
예 :
isEmpty(""), // true
isEmpty(33), // true (arguably could be a TypeError)
isEmpty([]), // true
isEmpty({}), // true
isEmpty({length: 0, custom_property: []}), // true
isEmpty("Hello"), // false
isEmpty([1,2,3]), // false
isEmpty({test: 1}), // false
isEmpty({length: 3, custom_property: [1,2,3]}) // false
ECMAScript5 브라우저 만 처리해야하는 경우 루프 Object.getOwnPropertyNames
대신 사용할 수 있습니다 hasOwnProperty
.
if (Object.getOwnPropertyNames(obj).length > 0) return false;
이렇게하면 개체에 열거 isEmpty
할 수 없는 속성 만있는 경우에도 올바른 결과를 얻을 수 있습니다.
ECMAScript5 (아직 모든 브라우저에서 지원되는 것은 아님)의 경우 다음을 사용할 수 있습니다.
Object.keys(obj).length === 0
편집 : 요즘 ES5 지원이 널리 보급되어 있기 때문에 아마도이 대신 ES5 솔루션 을 사용해야합니다 . 그래도 jQuery에서는 작동합니다.
쉽고 크로스 브라우저 방식은 다음을 사용하는 것입니다 jQuery.isEmptyObject
.
if ($.isEmptyObject(obj))
{
// do something
}
더 : http://api.jquery.com/jQuery.isEmptyObject/
그래도 jquery가 필요합니다.
추가 라이브러리를 추가하는 것이 마음에 들지 않으면 밑줄 과 lodash 는 편리한 isEmpty()
기능을 가지고 있습니다.
_.isEmpty({});
이 아기를 잠들게하자. Node, Chrome, Firefox 및 IE 9에서 테스트 된 경우 대부분의 사용 사례에서 다음과 같이 분명합니다.
- (for ... in ...)가 사용하는 가장 빠른 옵션입니다!
- 빈 객체의 경우 Object.keys (obj) .length가 10 배 느리다
- JSON.stringify (obj) .length는 항상 가장 느립니다 (놀랍지 않습니다)
- 일부 시스템에서는 Object.getOwnPropertyNames (obj) .length가 Object.keys (obj) .length보다 훨씬 오래 걸릴 수 있습니다.
최종 성능을 현명하게 사용하려면 다음을 사용하십시오.
function isEmpty(obj) {
for (var x in obj) { return false; }
return true;
}
또는
function isEmpty(obj) {
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }
return true;
}
노드 아래 결과 :
- 첫 번째 결과 :
return (Object.keys(obj).length === 0)
- 두 번째 결과 :
for (var x in obj) { return false; }...
- 세 번째 결과 :
for (var x in obj) { if (obj.hasOwnProperty(x)) return false; }...
- 네 번째 결과 :
return ('{}' === JSON.stringify(obj))
키가 0 인 물체 테스트 0.00018 0.000015 0.000015 0.000324
키가 1 개인 객체 테스트 0.000346 0.000458 0.000577 0.000657
키가 2 개인 객체 테스트 0.000375 0.00046 0.000565 0.000773
키가 3 개인 객체 테스트 0.000406 0.000476 0.000577 0.000904
4 개의 키로 물체 테스트 0.000435 0.000487 0.000589 0.001031
5 개 키로 물체 테스트 0.000465 0.000501 0.000604 0.001148
6 개의 키로 물체 테스트 0.000492 0.000511 0.000618 0.001269
7 개의 키로 물체 테스트 0.000528 0.000527 0.000637 0.00138
8 개의 키로 물체 테스트 0.000565 0.000538 0.000647 0.00159
100 개의 키로 물체 테스트 0.003718 0.00243 0.002535 0.01381
1000 개 키가있는 객체 테스트 0.0337 0.0193 0.0194 0.1337
일반적인 유스 케이스에서 키가 거의없는 비어 있지 않은 오브젝트를 테스트하고 키가 10 개 이상인 비어있는 오브젝트 또는 오브젝트를 거의 테스트하지 않는 경우 Object.keys (obj) .length 옵션을 고려하십시오. -그렇지 않으면보다 일반적인 (for ... in ...) 구현으로 이동하십시오.
Firefox는 Object.keys (obj) .length 및 Object.getOwnPropertyNames (obj) .length를 더 빠르게 지원하는 것으로 보이므로 비어 있지 않은 Object를 선택하는 것이 더 좋지만 여전히 비어있는 Object에 대해서는 ( for ... in ...)는 단순히 10 배 더 빠릅니다.
내 2 센트는 Object.keys (obj) .length가 키의 개체를 만들어 내부에 몇 개의 키가 있는지 계산하기 때문에 키를 파괴하기 때문에 좋지 않은 생각입니다! 그 객체를 만들려면 키를 덮어 씌워야합니다. 그래서 (for ... in ...) 옵션이 아닌 왜 그것을 사용하십시오 :)
var a = {};
function timeit(func,count) {
if (!count) count = 100000;
var start = Date.now();
for (i=0;i<count;i++) func();
var end = Date.now();
var duration = end - start;
console.log(duration/count)
}
function isEmpty1() {
return (Object.keys(a).length === 0)
}
function isEmpty2() {
for (x in a) { return false; }
return true;
}
function isEmpty3() {
for (x in a) { if (a.hasOwnProperty(x)) return false; }
return true;
}
function isEmpty4() {
return ('{}' === JSON.stringify(a))
}
for (var j=0;j<10;j++) {
a = {}
for (var i=0;i<j;i++) a[i] = i;
console.log('Testing for Object with '+Object.keys(a).length+' keys')
timeit(isEmpty1);
timeit(isEmpty2);
timeit(isEmpty3);
timeit(isEmpty4);
}
a = {}
for (var i=0;i<100;i++) a[i] = i;
console.log('Testing for Object with '+Object.keys(a).length+' keys')
timeit(isEmpty1);
timeit(isEmpty2);
timeit(isEmpty3);
timeit(isEmpty4, 10000);
a = {}
for (var i=0;i<1000;i++) a[i] = i;
console.log('Testing for Object with '+Object.keys(a).length+' keys')
timeit(isEmpty1,10000);
timeit(isEmpty2,10000);
timeit(isEmpty3,10000);
timeit(isEmpty4,10000);
우아한 방법-키 사용
var myEmptyObj = {};
var myFullObj = {"key":"value"};
console.log(Object.keys(myEmptyObj).length); //0
console.log(Object.keys(myFullObj).length); //1
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/keys
function isEmpty( o ) {
for ( var p in o ) {
if ( o.hasOwnProperty( p ) ) { return false; }
}
return true;
}
var x= {}
var y= {x:'hi'}
console.log(Object.keys(x).length===0)
console.log(Object.keys(y).length===0)
true
false
http://jsfiddle.net/j7ona6hz/1/
이러한 기본적인 JS 질문에 대한 많은 약한 답변을 보게 된 것에 놀랐습니다 ... 다음과 같은 이유로 가장 좋은 대답은 좋지 않습니다.
- 전역 변수를 생성합니다
- 반환
true
에undefined
for...in
자체적으로 매우 느린 사용- 내부 함수
for...in
는 쓸모가 없습니다- 마술false
없이 반환hasOwnProperty
하면 잘 작동합니다
실제로 더 간단한 해결책이 있습니다.
function isEmpty(value){
return Boolean(value && typeof value == 'object') && !Object.keys(value).length;
});
https://lodash.com/docs#isEmpty 는 매우 편리합니다.
_.isEmpty({}) // true
_.isEmpty() // true
_.isEmpty(null) // true
_.isEmpty("") // true
이것이 얼마나 나쁩니 까?
function(obj){
for(var key in obj){
return false; // not empty
}
return true; // empty
}
도서관이 필요 없습니다.
function(){ //must be within a function
var obj = {}; //the object to test
for(var isNotEmpty in obj) //will loop through once if there is a property of some sort, then
return alert('not empty')//what ever you are trying to do once
return alert('empty'); //nope obj was empty do this instead;
}
약간 해키 일 수 있습니다. 당신은 이것을 시도 할 수 있습니다.
if (JSON.stringify(data).length === 2) {
// Do something
}
이 방법의 단점 이 있는지 확실하지 않습니다 .
'사전'-객체를위한 빠른 온라인 사용자 :
function isEmptyDict(d){for (var k in d) return false; return true}
Array.isArray 및 Object.getOwnPropertyNames를 사용할 수없는 경우 대체를 쓸 수 있습니다.
XX.isEmpty = function(a){
if(Array.isArray(a)){
return (a.length==0);
}
if(!a){
return true;
}
if(a instanceof Object){
if(a instanceof Date){
return false;
}
if(Object.getOwnPropertyNames(a).length == 0){
return true;
}
}
return false;
}
아래에 객체가 있다고 상상해보십시오.
var obj1= {};
var obj2= {test: "test"};
상속받을 때 객체 평등을 테스트하기 위해 === 부호를 사용할 수 없다는 것을 잊지 마십시오 .ECMA 5 및 상위 버전의 자바 스크립트를 사용하는 경우 대답이 쉽습니다. 아래 함수를 사용할 수 있습니다.
function isEmpty(obj) {
//check if it's an Obj first
var isObj = obj !== null
&& typeof obj === 'object'
&& Object.prototype.toString.call(obj) === '[object Object]';
if (isObj) {
for (var o in obj) {
if (obj.hasOwnProperty(o)) {
return false;
break;
}
}
return true;
} else {
console.error("isEmpty function only accept an Object");
}
}
결과는 다음과 같습니다.
isEmpty(obj1); //this returns true
isEmpty(obj2); //this returns false
isEmpty([]); // log in console: isEmpty function only accept an Object
funtion isEmpty(o,i)
{
for(i in o)
{
return!1
}
return!0
}
여기 좋은 방법이 있습니다
function isEmpty(obj) {
if (Array.isArray(obj)) {
return obj.length === 0;
} else if (typeof obj === 'object') {
for (var i in obj) {
return false;
}
return true;
} else {
return !obj;
}
}
var hasOwnProperty = Object.prototype.hasOwnProperty;
function isArray(a) {
return Object.prototype.toString.call(a) === '[object Array]'
}
function isObject(a) {
return Object.prototype.toString.call(a) === '[object Object]'
}
function isEmpty(a) {
if (null == a || "" == a)return!0;
if ("number" == typeof a || "string" == typeof a)return!1;
var b = !0;
if (isArray(a)) {
if (!a.length)return!0;
for (var c = 0; c < a.length; c++)isEmpty(a[c]) || (b = !1);
return b
}
if (isObject(a)) {
for (var d in a)hasOwnProperty.call(a, d) && (isEmpty(a[d]) || (b = !1));
return b
}
return!0
}
이 결정을 사용할 수 있습니다.
var isEmpty = function(obj) {
for (var key in obj)
if(obj.hasOwnProperty(key))
return false;
return true;
}
Sean Vieira의 코드를 필요에 맞게 수정했습니다. null 및 undefined는 객체로 간주되지 않으며 숫자, 부울 값 및 빈 문자열은 false를 반환합니다.
'use strict';
// Speed up calls to hasOwnProperty
var hasOwnProperty = Object.prototype.hasOwnProperty;
var isObjectEmpty = function(obj) {
// null and undefined are not empty
if (obj == null) return false;
if(obj === false) return false;
if(obj === true) return false;
if(obj === "") return false;
if(typeof obj === "number") {
return false;
}
// Assume if it has a length property with a non-zero value
// that that property is correct.
if (obj.length > 0) return false;
if (obj.length === 0) return true;
// Otherwise, does it have any properties of its own?
// Note that this doesn't handle
// toString and valueOf enumeration bugs in IE < 9
for (var key in obj) {
if (hasOwnProperty.call(obj, key)) return false;
}
return true;
};
exports.isObjectEmpty = isObjectEmpty;
if (Object.getOwnPropertyNames(obj1).length > 0)
{
alert('obj1 is empty!');
}
여기 내 해결책
function isEmpty(value) {
if(Object.prototype.toString.call(value) === '[object Array]') {
return value.length == 0;
} else if(value != null && typeof value === 'object') {
return Object.getOwnPropertyNames(value).length == 0;
} else {
return !(value || (value === 0));
}
}
건배
객체는 프로토 타입으로 보강 된 연관 배열입니다.
Object.is () 메소드는 두 값이 같은 값인지 판별합니다.
객체 비교 :-
Object.is('LOL', 'LOL');// true
Object.is(console, console);// true
Object.is(null, null);// true
Object.is('ROFL', 'LOL');// false
Object.is([], []);// false
Object.is(0, -0);// false
Object.is(NaN, 0/0);// true
if (!Object.is)
{
// do something
}
참고 URL : https://stackoverflow.com/questions/4994201/is-object-empty
'development' 카테고리의 다른 글
ArithmeticException :“비 종료 소수점 확장; (0) | 2020.02.14 |
---|---|
LINQ를 사용하여 하나의 List <>에서 다른 List <>에없는 항목을 가져옵니다. (0) | 2020.02.14 |
MySQL에서 정규 표현식을 바꾸는 방법은 무엇입니까? (0) | 2020.02.14 |
부호없는 int와 size_t (0) | 2020.02.14 |
파이썬 제너레이터와 이터레이터의 차이점 (0) | 2020.02.14 |