etc./StackOverFlow

빈 JavaScript 객체를 어떻게 테스트합니까?

청렴결백한 만능 재주꾼 2021. 9. 26. 10:52
반응형

질문자 :falmp


AJAX 요청 후 때때로 내 애플리케이션이 다음과 같은 빈 객체를 반환할 수 있습니다.

 var a = {};

해당 여부를 어떻게 확인할 수 있습니까?



답변자 : Community Wiki


ECMA 5+ :

 // because Object.keys(new Date()).length === 0; // we have to do some additional check obj // null and undefined 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.isEmptyObject({}); // true

로다쉬 :

 _.isEmpty({}); // true

밑줄 :

 _.isEmpty({}); // true

후크

 Hoek.deepEqual({}, {}); // true

ExtJS

 Ext.Object.isEmpty({}); // true

AngularJS(버전 1)

 angular.equals({}, {}); // true

람다

 R.isEmpty({}); // true


답변자 : Christoph


ECMAScript 5 지원 을 사용할 수 있는 경우 Object.keys() 사용할 수 있습니다.

 function isEmpty(obj) { return Object.keys(obj).length === 0; }

ES3 및 이전 버전의 경우 이 작업을 수행하는 쉬운 방법이 없습니다. 속성을 명시적으로 반복해야 합니다.

 function isEmpty(obj) { for(var prop in obj) { if(obj.hasOwnProperty(prop)) return false; } return true; }


답변자 : Erik Töyrä Silfverswärd


같은 문제가 있지만 jQuery를 사용하는 사람들 을 위해 jQuery.isEmptyObject를 사용할 수 있습니다.



답변자 : dhruvio


이것은 내가 선호하는 솔루션입니다.

 var obj = {}; return Object.keys(obj).length; //returns 0 if empty or an integer > 0 if non-empty


답변자 : Baggz


Underscore.js 를 사용할 수 있습니다.

 _.isEmpty({}); // true


답변자 : Kamil Kiełczewski


성능

오늘 2020.01.17, Chrome v79.0, Safari v13.0.4 및 Firefox v72.0에서 macOS High Sierra 10.13.6에 대한 테스트를 수행했습니다. 선택한 솔루션을 위해.

결론

  • for-in (A, J, L, M) 기반 솔루션이 가장 빠름
  • JSON.stringify (B, K) 기반 솔루션은 느립니다.
  • Object (N) 기반 솔루션도 느립니다.

여기에 이미지 설명 입력

세부

아래 스니펫에는 15가지 솔루션이 있습니다. 컴퓨터에서 성능 테스트를 실행하려면 여기를 클릭하십시오. 이 링크는 2021.07.08 업데이트되었지만 테스트는 원래 여기 에서 수행되었으며 위 표의 결과는 거기에서 가져왔습니다(하지만 지금은 해당 서비스가 더 이상 작동하지 않는 것 같습니다).

 var log = (s, f) => console.log(`${s} --> {}:${f({})} {k:2}:${f({ k: 2 })}`); function A(obj) { for (var i in obj) return false; return true; } function B(obj) { return JSON.stringify(obj) === "{}"; } function C(obj) { return Object.keys(obj).length === 0; } function D(obj) { return Object.entries(obj).length === 0; } function E(obj) { return Object.getOwnPropertyNames(obj).length === 0; } function F(obj) { return Object.keys(obj).length === 0 && obj.constructor === Object; } function G(obj) { return typeof obj === "undefined" || !Boolean(Object.keys(obj)[0]); } function H(obj) { return Object.entries(obj).length === 0 && obj.constructor === Object; } function I(obj) { return Object.values(obj).every((val) => typeof val === "undefined"); } function J(obj) { for (const key in obj) { if (hasOwnProperty.call(obj, key)) { return false; } } return true; } function K(obj) { for (var prop in obj) { if (obj.hasOwnProperty(prop)) { return false; } } return JSON.stringify(obj) === JSON.stringify({}); } function L(obj) { for (var prop in obj) { if (obj.hasOwnProperty(prop)) return false; } return true; } function M(obj) { for (var k in obj) { if (obj.hasOwnProperty(k)) { return false; } } return true; } function N(obj) { return ( Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0 && Object.getPrototypeOf(obj) === Object.prototype ); } function O(obj) { return !(Object.getOwnPropertyNames !== undefined ? Object.getOwnPropertyNames(obj).length !== 0 : (function () { for (var key in obj) break; return key !== null && key !== undefined; })()); } log("A", A); log("B", B); log("C", C); log("D", D); log("E", E); log("F", F); log("G", G); log("H", H); log("I", I); log("J", J); log("K", K); log("L", L); log("M", M); log("N", N); log("O", O);

여기에 이미지 설명 입력

제 답변이 도움이 되었다면 커피를 사주세요 .



답변자 : es cologne


if(Object.getOwnPropertyNames(obj).length === 0){ //is empty }

http://bencollier.net/2011/04/javascript-is-an-object-empty/ 참조



답변자 : Ateszki


JSON.stringify를 사용하는 것은 어떻습니까? 거의 모든 최신 브라우저에서 사용할 수 있습니다.

 function isEmptyObject(obj){ return JSON.stringify(obj) === '{}'; }


답변자 : Jonathan Petitcolas


오래된 질문이지만 문제가 있습니다. 객체가 비어 있지 않은지 확인하는 것이 유일한 목적이라면 JQuery를 포함하는 것은 좋은 생각이 아닙니다. 대신 JQuery의 코드를 자세히 살펴보고 다음과 같이 답을 얻을 수 있습니다.

 function isEmptyObject(obj) { var name; for (name in obj) { if (obj.hasOwnProperty(name)) { return false; } } return true; }


답변자 : Anish Nair


방금 비슷한 상황에 처했습니다. 저는 JQuery를 사용하고 싶지 않았고 순수 자바스크립트를 사용하여 이 작업을 수행하고 싶었습니다.

그리고 내가 한 것은 다음 조건을 사용하는 것이었고 그것은 나를 위해 일했습니다.

 var obj = {}; if(JSON.stringify(obj) === '{}') { //This will check if the object is empty //Code here.. }

같지 않은 경우 다음을 사용하십시오. JSON.stringify(obj) !== '{}'

이 JSFiddle을 확인하십시오



답변자 : download


최신 브라우저를 사용하는 경우 간단한 방법이 있습니다. Object.keys(obj).length == 0



답변자 : davidhadas


Object.keys(obj).length(ECMA 5+에 대해 위에서 제안한 대로)를 사용하면 빈 객체에 대해 10배 더 느립니다! 구식(for...in) 옵션을 유지합니다.

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; }

Is object empty? 에서 자세한 테스트 결과 및 테스트 코드를 참조하세요.



답변자 : Ashutosh Ranjan


개체 키 수를 확인할 수 있습니다.

 if (Object.keys(a).length > 0) { // not empty }


답변자 : Thevs


  1. 그냥 해결 방법입니다. 데이터가 없는 경우 서버에서 특별한 속성을 생성할 수 있습니까?

    예를 들어:

     var a = {empty:true};

    그런 다음 AJAX 콜백 코드에서 쉽게 확인할 수 있습니다.

  2. 확인하는 또 다른 방법:

     if (a.toSource() === "({})") // then 'a' is empty

편집 : JSON 라이브러리 (fe JSON.js)를 사용하는 경우 JSON.encode() 함수를 시도하고 빈 값 문자열에 대해 결과를 테스트할 수 있습니다.



답변자 : Vikrant


Object.entries() 에 대한 ES2017 사양에 따라 최신 브라우저를 사용하면 확인이 간단합니다.

 Object.entries({}).length === 0


답변자 : Slava Fomin II


객체가 비어 있는지 확인하는 완전한 함수를 만들었습니다.

가능한 경우 ECMAScript 5 (ES5) 기능의 Object.keys 를 사용 하여 최상의 성능(호환성 표 참조)을 달성하고 이전 엔진(브라우저)에 가장 호환되는 접근 방식으로 대체합니다.

해결책

 /** * 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이 있습니다.

나는 그것이 누군가를 도울 수 있기를 바랍니다. 건배!



답변자 : NiKo


내 테이크:

 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() 구현하는 것은 아니라고 생각합니다.



답변자 : kiranvj


나는 이것을 사용하고 있다.

 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; }


답변자 : ikettu


function isEmpty(obj) { for(var i in obj) { return false; } return true; }


답변자 : GibboK


다음 예제는 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



답변자 : Tudor Morar


나는 적어도 하나의 키가 있는지 확인하러 갈 것입니다. 그것이 비어 있지 않다고 말하는 것으로 충분할 것입니다.

 Boolean(Object.keys(obj || {})[0]) // obj || {} checks for undefined


답변자 : Anton Danilchenko


jQuery에는 이 경우에 대해 isEmptyObject()

 jQuery.isEmptyObject({}) // true jQuery.isEmptyObject({ foo: "bar" }) // false

http://api.jquery.com/jQuery.isEmptyObject/에서 자세히 읽어보세요.



답변자 : ahmadalibaloch


후드 아래에서 모든 라이브러리의 모든 빈 검사 방법은 객체 키 검사 논리를 사용합니다. 그것을 이해할 수 있게 만드는 이상한 방법은 여기 에 설명된 방법에 넣을 수 있습니다.

 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


답변자 : iman



jQuery 또는 다른 라이브러리를 사용하지 않은 이 간단한 코드를 사용할 수 있습니다.

 var a=({}); //check is an empty object if(JSON.stringify(a)=='{}') { alert('it is empty'); } else { alert('it is not empty'); }

JSON 클래스와 해당 함수( parsestringify )는 매우 유용하지만 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


답변자 : DiegoAraujo


내가 찾은 가장 좋은 방법:

 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


답변자 : jichi


jQuery와 웹 브라우저를 사용할 수 없는 경우 underscore.js에 isEmpty 함수도 있습니다.

 _.isEmpty({}) // returns true

또한 입력 매개변수를 개체로 가정하지 않습니다. 목록이나 문자열 또는 정의되지 않은 경우에도 정답이 됩니다.



답변자 : Jesse


정답은 다음과 같습니다.

 const isEmptyObject = obj => Object.getOwnPropertyNames(obj).length === 0 && Object.getOwnPropertySymbols(obj).length === 0 && Object.getPrototypeOf(obj) === Object.prototype;

이것은 다음을 확인합니다.

  • 개체에는 자체 속성이 없습니다(열거 가능성에 관계없이).
  • 개체에는 고유한 속성 기호가 없습니다.
  • 객체의 프로토타입은 정확히 Object.prototype 입니다.

{} 생성된 객체와 구별할 수 없습니다.



답변자 : Dohd


더 간단한 솔루션: var a = {};
a가 비어 있는 경우 : !Object.keys(a).lengthtrue 반환합니다.



답변자 : Fábio BC Souza


2021년 - 솔루션

필요한 것은 Object.entries(obj).length 입니다. 네이티브 프로토타입에서 만지는 것은 좋지 않습니다.

자신만의 기능을 만들고 원하는 대로 사용할 수 있습니다. 제 경우에는 다음과 같은 모듈 정의가 있는 utils

utils/isEmpty.js

 export default (obj) => !Object.entries(obj).length

someFileToUse.js

 import isEmpty from '~/utils/isEmpty.js' const obj1 = {}; const obj2 = {somekey: "someValue"}; console.log(isEmpty(obj1)) // -> true console.log(isEmpty(obj2)) // -> false


답변자 : starikovs


Thevs 답변 외에도 :

 var o = {}; alert($.toJSON(o)=='{}'); // true var o = {a:1}; alert($.toJSON(o)=='{}'); // false

jquery + jquery.json입니다.



출처 : Here


출처 : http:www.stackoverflow.com/questions/679915/how-do-i-test-for-an-empty-javascript-object">

반응형