json 자바스크립트 - 빈 JavaScript 객체를 테스트하려면 어떻게해야합니까?




배열 체크 (25)

AJAX 요청 후 때때로 내 응용 프로그램은 다음과 같이 빈 객체를 반환 할 수 있습니다.

var a = {};

그게 사실인지 어떻게 확인할 수 있습니까?


Answers

또 다른 간단하고 순수한 JS 방식 :)

if (JSON.stringify(pathParams) === '{}')


간단한 루프 :

var is_empty = true;
for(var i in obj) {
    is_empty = false;
    break;
}

나의 테이크 :

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() 구현한다고 생각하지 않습니다.


JSON.stringify를 사용하는 것은 어떻습니까? 현대의 모든 브라우저에서 거의 사용 가능합니다.

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

적어도 하나의 키가 있는지 확인하기 위해 갈 것입니다. 그것이 비어 있지 않다는 것을 말하면 충분합니다.

Boolean(Object.keys(obj)[0])

ECMA 5+ :

// because Object.keys(new Date()).length === 0;
// we have to do some additional check
Object.keys(obj).length === 0 && obj.constructor === Object

Pre-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

Underscore :

_.isEmpty({}); // true

Hoek

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

ExtJS

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

AngularJS (버전 1)

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

Ramda

R.isEmpty({}); // true

정답은 다음과 같습니다.

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

다음을 확인합니다.

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

즉, 개체는 {} 작성된 개체와 구별 할 수 없습니다.


경고! JSON의 한계에주의하십시오.

javascript:
  obj={  f:function(){}  };
  alert( "Beware!! obj is NOT empty!\n\nobj = {  f:function(){}  }" + 
               "\n\nJSON.stringify( obj )\n\nreturns\n\n" +
                        JSON.stringify( obj ) );

전시

    Beware!! obj is NOT empty!

    obj = {  f:function(){}  }

    JSON.stringify( obj )

    returns

    {}


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

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

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

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


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



동일한 문제가 있지만 jQuery를 사용하는 사용자 jQuery 를 사용할 수 있습니다.


방금 비슷한 상황에 처 했어. 나는 JQuery를 사용하고 싶지 않았고 순수한 자바 스크립트를 사용하여 이것을하고 싶었다.

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

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

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

    예 :

    var a = {empty:true};
    

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

  2. 확인하는 또 다른 방법은 다음과 같습니다.

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

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


또 다른 대안은 jquery (32kB), lodash (50kB) 또는 underscore (16.4kB)와 반대로 is.js (14kB)를 사용하는 것입니다. is.js는 객체가 비어 있는지 여부를 결정하는 데 사용할 수있는 앞서 언급 한 라이브러리 중 가장 빠른 라이브러리임이 입증되었습니다.

http://jsperf.com/check-empty-object-using-libraries

분명히 모든 라이브러리가 정확히 동일하지 않기 때문에 DOM을 쉽게 조작 할 필요가 있다면 jquery 는 여전히 좋은 선택이 될 수 있습니다. 또는 유형 검사보다 더 많은 것을 필요로한다면 lodash 또는 underscore 을 사용하는 것이 좋습니다. is.js 에 대한 구문은 다음과 같습니다.

var a = {};
is.empty(a); // true
is.empty({"hello": "world"}) // false

밑줄과 lodash의 _.isObject() 와 마찬가지로 이것은 objects 에만 해당되는 것이 아니라 arraysstrings 에도 적용됩니다.

후드 아래에서이 라이브러리는 Object.keys 와 비슷한 Object.getOwnPropertyNames 를 사용하지만 Object.getOwnPropertyNameshere 설명 된대로 열거 가능하고 열거되지 않는 속성을 반환하므로 더 철저 here .

is.empty = function(value) {
    if(is.object(value)){
        var num = Object.getOwnPropertyNames(value).length;
        if(num === 0 || (num === 1 && is.array(value)) || (num === 2 && is.arguments(value))){
            return true;
        }
        return false;
    } else {
        return value === '';
    }
};

이해할 수있는 라이브러리를 가져오고 싶지 않고 배열이나 문자열이 아닌 객체 만 검사한다는 것을 알고 있다면 다음 함수가 필요에 따라 적절해야합니다.

function isEmptyObject( obj ) {
    return Object.getOwnPropertyNames(obj).length === 0;
}

이것은 is.js보다 조금 빠릅니다. 단지 그것이 객체인지 여부를 확인하지 않기 때문입니다.


이 작업을 수행하는 쉬운 방법은 없습니다. 속성을 명시 적으로 반복해야합니다.

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

Underscore 를 사용할 수 있습니다.

_.isEmpty({}); // true

Object.keys (obj) .length (위에서 ECMA 5+에서 제안한)를 사용하면 빈 객체의 경우 10 배 느려집니다! 오래된 학교 (in ...) 옵션을 유지하십시오.

Node, Chrom, 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;
}

객체가 비어있는 경우 자세한 테스트 결과 및 테스트 코드를 참조하십시오 .


Thevs 답변 외에도 :

var o = {};
alert($.toJSON(o)=='{}'); // true

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

jquery + jquery.json입니다.


jQuery에는이 경우 isEmptyObject() 특수 함수가 있습니다.

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

jQuery 자세한 내용을 읽어보십시오.


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

_.isEmpty({}) // returns true

또한 입력 매개 변수가 객체라고 가정하지 않습니다. 목록이나 문자열 또는 정의되지 않은 경우 정답을 표시합니다.






javascript json