AJAX 요청 후 때때로 내 응용 프로그램이 다음과 같은 빈 객체를 반환 할 수 있습니다.
var a = {};
그런 경우인지 어떻게 확인할 수 있습니까?
if( Object.entries(a).length > 0){ //do }
AJAX 요청 후 때때로 내 응용 프로그램이 다음과 같은 빈 객체를 반환 할 수 있습니다.
var a = {};
그런 경우인지 어떻게 확인할 수 있습니까?
if( Object.entries(a).length > 0){ //do }
답변:
ECMA 5+ :
// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object
그러나 이로 인해 불필요한 배열 (반환 값 keys
) 이 생성 됩니다.
ECMA 5 이전 :
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop)) {
return false;
}
}
return JSON.stringify(obj) === JSON.stringify({});
}
jQuery :
jQuery.isEmptyObject({}); // true
lodash :
_.isEmpty({}); // true
밑줄 :
_.isEmpty({}); // true
Hoek.deepEqual({}, {}); // true
Ext.Object.isEmpty({}); // true
angular.equals({}, {}); // true
R.isEmpty({}); // true
Object.keys(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
(new Date()).constructor === Date
또는 반대로 ({}).constructor === Object
.
Object.keys()
열거 할 수없는 속성이나 기호는 확인하지 않습니다. 당신은 사용해야 Object.getOwnPropertyNames()
하고 Object.getOwnPropertySymbols()
대신. 또한 Object.getPrototypeOf()
객체의 프로토 타입을 얻는 올바른 방법입니다. obj.constructor
쉽게 위조 될 수 있습니다. 예 : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true
.
이 작업을 수행하는 쉬운 방법은 없습니다. 속성을 명시 적으로 반복해야합니다.
function isEmpty(obj) {
for(var prop in obj) {
if(obj.hasOwnProperty(prop))
return false;
}
return true;
}
경우 인 ECMAScript 5 지원이 가능하며, 당신이 사용할 수있는 Object.keys()
대신 :
function isEmpty(obj) {
return Object.keys(obj).length === 0;
}
isEmpty()
이이므로 false
속성이있는 경우 반환해야 합니다.
동일한 문제가 있지만 jQuery를 사용하는 사용자는 jQuery.isEmptyObject 를 사용할 수 있습니다 .
underscore.js
이것이 내가 선호하는 솔루션입니다.
var obj = {};
return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty
Object.keys(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
new Date()
객체가 아닙니다. nd = new Date(); nd.constructor === Object;
결과 false
.
Underscore.js 를 사용할 수 있습니다 .
_.isEmpty({}); // true
if(Object.getOwnPropertyNames(obj).length === 0){
//is empty
}
http://bencollier.net/2011/04/javascript-is-an-object-empty/를 참조하십시오
Object.getOwnPropertyNames(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
JSON.stringify를 사용하는 것은 어떻습니까? 거의 모든 최신 브라우저에서 사용할 수 있습니다.
function isEmptyObject(obj){
return JSON.stringify(obj) === '{}';
}
방금 비슷한 상황에 처했습니다. JQuery를 사용하고 싶지 않았으며 순수한 Javascript를 사용 하여이 작업을 원했습니다.
그리고 내가 한 일은 다음 조건을 사용하여 저에게 효과적이었습니다.
var obj = {};
if(JSON.stringify(obj) === '{}') { //This will check if the object is empty
//Code here..
}
같지 않으면 다음을 사용하십시오. JSON.stringify(obj) !== '{}'
이 JSFiddle을 확인하십시오
오래된 질문이지만 문제가 있습니다. 객체가 비어 있지 않은지 확인하는 것이 유일한 목적이라면 JQuery를 포함시키는 것은 좋은 생각이 아닙니다. 대신 JQuery의 코드 깊숙이 들어가면 답을 얻을 수 있습니다.
function isEmptyObject(obj) {
var name;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
return false;
}
}
return true;
}
최신 브라우저를 사용하는 경우 간단한 방법이 있습니다.
Object.keys(obj).length == 0
Object.keys
표준 방법이지만 객체에는 키 속성이 없습니다. 따라서이 코드는 실수로 0이 아닌 key
속성으로 값이 지정된 속성을 갖는 경우를 제외하고는 객체를 비어있는 것으로보고합니다 length
. 끔찍 해요!
Object.keys(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
오늘 2020.01.17 Chrome v79.0, Safari v13.0.4 및 Firefox v72.0의 MacOs HighSierra 10.13.6에서 선택한 솔루션에 대한 테스트를 수행합니다.
결론
for-in
(A, J, L, M) 기반 솔루션 이 가장 빠름JSON.stringify
(B, K) 기반 솔루션 은 느립니다Object
(N) 기반의 솔루션 은 느립니다.아래의 스 니펫에는 15 가지 솔루션이 제시되어 있습니다. 컴퓨터에서 성능 테스트를 실행하려면 여기를 클릭하십시오 .
Object.keys (obj) .length (ECMA 5+에 대해 위에서 제안한대로)를 사용하면 빈 객체에 대해 10 배 느려집니다! 올드 스쿨 (for ... in) 옵션을 유지하십시오.
Node, Chrome, Firefox 및 IE 9에서 테스트 한 결과, 대부분의 사용 사례에서 다음과 같이 나타납니다.
결론적으로 현명한 성능을 사용하려면 다음을 사용하십시오.
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;
}
개체가 비어 있습니까? 에서 자세한 테스트 결과 및 테스트 코드를 참조하십시오 .
Object.keys
느리지 만 코드는 적습니다. 작은 페이지에서 이것을 10 번 정도 ... 추가 코드의 추가 구문 분석 시간을 고려할 때 여전히 느려 집니까?
Object 키의 개수를 확인할 수 있습니다.
if (Object.keys(a).length > 0) {
// not empty
}
해결 방법입니다. 데이터가없는 경우 서버가 특정 속성을 생성 할 수 있습니까?
예를 들면 다음과 같습니다.
var a = {empty:true};
그런 다음 AJAX 콜백 코드에서 쉽게 확인할 수 있습니다.
그것을 확인하는 또 다른 방법 :
if (a.toSource() === "({})") // then 'a' is empty
편집 : JSON 라이브러리 (fe JSON.js)를 사용하는 경우 JSON.encode () 함수를 시도하고 빈 값 문자열에 대해 결과를 테스트 할 수 있습니다.
toSource()
비표준이며 IE 또는 Opera에서 작동하지 않습니다 (및 잠재적으로 확인하지 않은 다른 브라우저)
toSource
절에 속성이 나와 있지 않습니다 . MDC에 따르면 JS1.3 (예 : Netscape Navigator 4.06)에 도입되었지만 ECMA-262, 3 판에는 없습니다!
toSource()
을 수행하는 끔찍한 방법 JSON.encode()
입니다. 비어 있는지 확인하려면 전체 객체를 나타내는 문자열을 작성해야합니다. 사물을 문자열로 변환하는 오버 헤드가 있지만 객체에 백만 개의 속성이있는 경우 백만 가지를 변환해야하지만 실제로 하나만 보면 비어 있지 않다는 것을 알 수 있습니다.
객체가 비어 있는지 확인하는 완전한 기능을 만들었습니다.
그것은 사용 Object.keys
에서 ECMAScript를 5 (참조 최상의 성능을 달성하기 위해 (ES5) 기능이 가능하다면 호환성 테이블 구형 엔진 (브라우저)에 가장 호환 접근 방식) 및 폴백을.
/**
* Returns true if specified object has no properties,
* false otherwise.
*
* @param {object} object
* @returns {boolean}
*/
function isObjectEmpty(object)
{
if ('object' !== typeof object) {
throw new Error('Object must be specified.');
}
if (null === object) {
return true;
}
if ('undefined' !== Object.keys) {
// Using ECMAScript 5 feature.
return (0 === Object.keys(object).length);
} else {
// Using legacy compatibility mode.
for (var key in object) {
if (object.hasOwnProperty(key)) {
return false;
}
}
return true;
}
}
여기 요지가 있습니다이 코드 는 .
그리고 여기 JSFiddle이 있습니다 에 데모와 간단한 테스트 이 있습니다.
누군가에게 도움이되기를 바랍니다. 건배!
Object.keys(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
나는 이것을 사용하고 있습니다.
function isObjectEmpty(object) {
var isEmpty = true;
for (keys in object) {
isEmpty = false;
break; // exiting since we found that the object is not empty
}
return isEmpty;
}
예 :
var myObject = {}; // Object is empty
var isEmpty = isObjectEmpty(myObject); // will return true;
// populating the object
myObject = {"name":"John Smith","Address":"Kochi, Kerala"};
// check if the object is empty
isEmpty = isObjectEmpty(myObject); // will return false;
최신 정보
또는
isEmptyObject의 jQuery 구현을 사용할 수 있습니다.
function isEmptyObject(obj) {
var name;
for (name in obj) {
return false;
}
return true;
}
다음 예제는 JavaScript 객체가 비어 있는지 테스트하는 방법을 보여줍니다. 비어 있으면 비어있는 속성이 없습니다.
이 스크립트는 ES6에서 작동합니다.
const isEmpty = (obj) => {
if (obj === null ||
obj === undefined ||
Array.isArray(obj) ||
typeof obj !== 'object'
) {
return true;
}
return Object.getOwnPropertyNames(obj).length === 0;
};
console.clear();
console.log('-----');
console.log(isEmpty('')); // true
console.log(isEmpty(33)); // true
console.log(isEmpty([])); // true
console.log(isEmpty({})); // true
console.log(isEmpty({ length: 0, custom_property: [] })); // false
console.log('-----');
console.log(isEmpty('Hello')); // true
console.log(isEmpty([1, 2, 3])); // true
console.log(isEmpty({ test: 1 })); // false
console.log(isEmpty({ length: 3, custom_property: [1, 2, 3] })); // false
console.log('-----');
console.log(isEmpty(new Date())); // true
console.log(isEmpty(Infinity)); // true
console.log(isEmpty(null)); // true
console.log(isEmpty(undefined)); // true
Object.entries () 에 대한 ES2017 사양에 따라 최신 브라우저를 사용하면 간단하게 확인할 수 있습니다.
Object.entries({}).length === 0
Object.keys
또는 Object.values
?
function isEmpty(obj) {
for(var i in obj) { return false; }
return true;
}
Object
가 프로토 타입 체인을 통해 메소드로 확장되는 경우에도 마찬가지입니다. 열거 가능하고 for in
명령문이 열거 가능한 특성을 통해 반복 되기 때문입니다 .
jQuery에는 isEmptyObject()
이 경우에 특별한 기능 이 있습니다.
jQuery.isEmptyObject({}) // true
jQuery.isEmptyObject({ foo: "bar" }) // false
http://api.jquery.com/jQuery.isEmptyObject/에서 자세히 알아보십시오.
적어도 하나의 키가 있는지 확인하려고합니다. 비어 있지 않다고 말하면 충분합니다.
typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])
false
값을 반환 하면 어떻게됩니까? 결과 false
가 잘못되었습니다.
후드 아래에서 모든 라이브러리의 모든 빈 검사 방법은 개체 키 검사 논리를 사용합니다. 이해하기 쉬운 방법으로, 여기 에 설명 된 방법을 넣을 수 있습니다 .
for(key in obj){
//your work here.
break;
}
ES5 에서 발전한 것은 이제 Object.Keys
객체를 매개 변수로 취하는 방법을 사용하여 객체의 키 길이를 간단히 확인할 수 있습니다 .
if(Object.keys(obj).length > 0){
//do your work here
}
또는 Lodash 를 사용하는 경우 ( 그렇습니다 ).
_.isEmpty(obj) //==true or false
jQuery 또는 다른 라이브러리를
사용하지 않은이 간단한 코드를 사용할 수 있습니다
var a=({});
//check is an empty object
if(JSON.stringify(a)=='{}') {
alert('it is empty');
} else {
alert('it is not empty');
}
JSON 클래스와 그 기능 ( 구문 분석 및 stringify )은 매우 유용하지만 IE7 에는 약간의 문제가 있어이 간단한 코드 http://www.json.org/js.html로 해결할 수 있습니다 .
다른 간단한 방법 (가장 간단한 방법) : jQuery 또는 JSON 객체를
사용하지 않고도이 방법을 사용할 수 있습니다 .
var a=({});
function isEmptyObject(obj) {
if(typeof obj!='object') {
//it is not object, so is not empty
return false;
} else {
var x,i=0;
for(x in obj) {
i++;
}
if(i>0) {
//this object has some properties or methods
return false;
} else {
//this object has not any property or method
return true;
}
}
}
alert(isEmptyObject(a)); //true is alerted
내가 찾은 가장 좋은 방법 :
function isEmpty(obj)
{
if (!obj)
{
return true;
}
if (!(typeof(obj) === 'number') && !Object.keys(obj).length)
{
return true;
}
return false;
}
작동합니다 :
t1: {} -> true
t2: {0:1} -: false
t3: [] -> true
t4: [2] -> false
t5: null -> true
t6: undefined -> true
t7: "" -> true
t8: "a" -> false
t9: 0 -> true
t10: 1 -> false
if (!obj && obj !== 0)
.
나의 테이크 :
function isEmpty(obj) {
return !Object.keys(obj).length > 0;
}
var a = {a:1, b:2}
var b = {}
console.log(isEmpty(a)); // false
console.log(isEmpty(b)); // true
모든 브라우저가 Object.keys()
현재 구현되지는 않는다고 생각합니다 .
Object.keys(new Date()).length === 0
; 따라서이 답변은 오도 될 수 있습니다.
jQuery와 웹 브라우저를 사용할 수없는 경우 underscore.js에 isEmpty 함수도 있습니다.
_.isEmpty({}) // returns true
또한 입력 매개 변수를 오브젝트로 가정하지 않습니다. 목록이나 문자열 또는 정의되지 않은 경우에도 정답이됩니다.
정답은 다음과 같습니다.
const isEmptyObject = obj =>
Object.getOwnPropertyNames(obj).length === 0 &&
Object.getOwnPropertySymbols(obj).length === 0 &&
Object.getPrototypeOf(obj) === Object.prototype;
이것은 다음을 확인합니다.
Object.prototype
입니다.다시 말해 객체는로 만든 객체와 구별 할 수 없습니다 {}
.
Thevs 답변 외에도 :
var o = {};
alert($.toJSON(o)=='{}'); // true
var o = {a:1};
alert($.toJSON(o)=='{}'); // false
jquery + jquery.json입니다.
$.isEmptyObject()
하면 명확하지 않은 변환으로 사이클을 낭비하지 마십시오.