හිස් ජාවාස්ක්‍රිප්ට් වස්තුවක් සඳහා මා පරීක්ෂා කරන්නේ කෙසේද?


3129

AJAX ඉල්ලීමකින් පසුව, සමහර විට මගේ යෙදුම හිස් වස්තුවක් ලබා දෙනු ඇත, වැනි:

var a = {};

එය එසේ දැයි මා පරීක්ෂා කරන්නේ කෙසේද?


7
ඔබ JSON.js ස්ක්‍රිප්ට් භාවිතා කරනවාද? නැතහොත් වෙනත් JSON පුස්තකාලයක්. එවිට ඔබට JSON.encode () ශ්‍රිතය භාවිතා කර var නූල් බවට පරිවර්තනය කර එය පරීක්ෂා කරන්න.
තේව්ස්

if( Object.entries(a).length > 0){ //do }
මුහම්මද් ෂාසාඩ්

Answers:


5456

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

ExtJS

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

AngularJS (අනුවාදය 1)

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

රාම්ඩා

R.isEmpty({}); // true


20
Object.keys(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

6
දේවල් තදින් අල්ලා ගැනීම වෙනුවට ඔබට මෙම කාරණයෙන් ප්‍රයෝජන ගත හැකිය: (new Date()).constructor === Dateහෝ අනෙක් අතට ({}).constructor === Object.
ජෝන් නෙල්සන්

2
angular.equals ({}, {});
ජෙරමි ඒ. වෙස්ට්

11
Object.keys()ගණන් කළ නොහැකි ගුණාංග හෝ සංකේත පරික්ෂා නොකරයි. ඔබ භාවිතා කළ යුතු Object.getOwnPropertyNames()අතර Object.getOwnPropertySymbols()ඒ වෙනුවට. එසේම, Object.getPrototypeOf()වස්තුවක මූලාකෘතියක් ලබා ගැනීම සඳහා නිවැරදි ක්‍රමය වේ. obj.constructorපහසුවෙන් ව්‍යාජ ලෙස සකස් කළ හැකිය. උදාහරණය : function Foo() {} Foo.prototype.constructor = Object; (new Foo()).constructor === Object // true.
ජෙසී

863

මෙය කිරීමට පහසු ක්‍රමයක් නොමැත. ඔබට පැහැදිලිවම ගුණාංග ලූප කිරීමට සිදුවේ:

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

    return true;
}

නම් සම්මතයන් 5 සහාය ලබා ගත හැකි වන අතර, ඔබ භාවිතා කළ හැකිය Object.keys()වෙනුවට:

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

56
මෙය ඉතා හොඳින් හෝ වඩාත් සරලව ක්‍රියා කරයි: ශ්‍රිතය isEmpty (object) {සඳහා (var i වස්තුවෙහි) {නැවත සත්‍ය වේ; false බොරු ආපසු එවීම; }
නිකලස් ක්‍රෙඩ්බර්ග්

36
මෙම ශ්‍රිතයේ සත්‍ය හා අසත්‍යය ආපසු හැරවිය යුතු නොවේද?
namtax

25
@namtax: නැත - ශ්‍රිතය නම් කර ඇත isEmpty(), එබැවින් එය falseදේපලක් තිබේ නම් එය ආපසු යා යුතුය
ක්‍රිස්ටෝෆ්

6
හිස් වස්තුව පෙරනිමි වස්තු පන්තිය දීර් extend කරනු ඇති නමුත් වස්තු මූලාකෘතිය වෙනස් කළහොත් ඔබේ සරල කළ ශ්‍රිතය සලකා බලනු ඇත: Object.prototype.a = 'හායි'; var obj = {}; ඇඟවීම් (obj.a); // ප්‍රතිදානයන් "හායි" isEmpty (obj) // අසත්‍යය නැවත ලබා දෙයි
venimus

29
O (n) කාල සංකීර්ණත්වය සහ O (n) අභ්‍යවකාශ සංකීර්ණතාවයෙන් ඔබ දෙවන උදාහරණය භාවිතා නොකළ යුතු අතර පළමු වැන්න O (1) වේ.
බ්‍රයන්

572

ඔබට එකම ගැටළුවක් ඇති නමුත් jQuery භාවිතා කරන අයට, ඔබට jQuery.isEmptyObject භාවිතා කළ හැකිය .


43
හේයි! IE 8 නිකුතුව නිදොස්කරණය කිරීම සඳහා මම පැය කිහිපයක් ගත කළෙමි, එය ගැටළුව ඇති කළේ jQuery.isEmptyObject බව සොයා ගැනීමට පමණි. වස්තුව හිස් නම් එය සත්‍ය වේ.
MFD3000

163
ප්‍රශ්නය කිසිසේත් jQuery ගැන නොවේ නම් ඔබ jQuery ඇතුළු පිළිතුරු පළ කරන්නේ ඇයි?
ඊරු

47
එහි පැරණි අදහසක් මම දනිමි, නමුත් ඔබේ ප්‍රශ්නය @ MFD3000 ගැන මම පුදුම වෙමි, මන්ද ලේඛනය මෙසේ කියයි: වස්තුව හිස් නම් (නම සඳහන් වන පරිදි)
සත්‍යය ආපසු එයි

21
එවැනි මූලික කාර්යයක් සඳහා jQuery ද ඇතුළුව මම නිවැරදි පිළිතුර ලෙස හඳුන්වන්නේ නැත. වර්තමානයේ jQuery සෑම තැනම පාහේ පවතින බව සත්‍යයකි, නමුත් එය අප ඉතා දක්ෂ භාෂාවක් වටා ගොඩනගා ඇති බව අප අමතක නොකළ යුතුය.
පැබ්ලෝ මෙෂර්

54
මෙම අදහස් දැක්වීමේදී සාමාන්‍ය ජේ.එස්. වෙබයේ ජාවාස්ක්‍රිප්ට් විශාල ප්‍රමාණයක් jQuery මත ලියා ඇති බව කවුරුත් දනිති, එබැවින් වස්තු පරීක්ෂා කිරීම සඳහා දැනටමත් ගොඩනඟන ලද ක්‍රමවේදයක් තිබේ නම් jQuery සඳහා මෙහි විසඳුමක් ලබා දීම සම්පූර්ණයෙන්ම පිළිගත හැකිය. උදව් සොයන දහස් ගණනක් සංවර්ධකයින් මෙම පිළිතුර ප්‍රයෝජනවත් යැයි සිතනු ඇත. එය කළ හැකි එකම ක්‍රමය කිසිවෙකු කීවේ නැත. භාවිතා කිරීමට විසඳුමක් පළ කළ පුද්ගලයා ගැන කිසිවෙකු සියලු underscore.js
ප්‍රභූන්

281

මෙය මා වඩාත් කැමති විසඳුමයි:

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

1
IE9 BTW සමඟ අනුකූලතා ගැටළුව. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
doublejosh

3
@ ජෙරෝ ෆ්‍රැන්සානි: නෑ ඒක නැහැ
නිකොස්කිප්

Object.keys ({}). දිග (සඳහා ... සඳහා ...) විකල්පයට වඩා 10 ගුණයකින් මන්දගාමී වේ - මම යෝජනා කරන්නේ එය හිස් එකක් දැයි පරීක්ෂා කිරීමේ ක්‍රමයක් ලෙස එය වළක්වා ගැනීමට ය.
davidhadas

10
Object.keys(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

new Date()වස්තුවක් නොවේ. nd = new Date(); nd.constructor === Object;ප්‍රති results ල false.
pors

204

ඔබට Underscore.js භාවිතා කළ හැකිය .

_.isEmpty({}); // true

19
නැතහොත් ඔබට ලොඩාෂ් භාවිතා කිරීම හිස් ය ( lodash.com/docs#isEmpty ), නමුත් එය jQuery විසඳුමක් භාවිතා කිරීමට වඩා වෙනස් වන්නේ කෙසේද - ඔබට තවමත් අතිරේක පුස්තකාලයක් ස්ථාපනය කළ යුතුය. මම හිතන්නේ වැනිලා ජාවාස්ක්‍රිප්ට් විසඳුමක් එහි අභිප්‍රායයි.
tfmontague

10
ඔබට Node.js සමඟ පසුබිමේ JS භාවිතා කිරීමට අවශ්‍ය නම් එය වෙනස් වේ. පසුපෙළේ jQuery (DOM හැසිරවීම් සඳහා වැඩි වශයෙන් භාවිතා කරන ඉදිරිපස පුස්තකාලයක්) භාවිතා කිරීමට ස්වල්ප දෙනෙකුට අවශ්‍ය වනු ඇත.
නාන්

3
ftfmontague අවධාරනය නෝඩ් යෙදුම් වල බහුලව දක්නට ලැබේ, සේවාදායකයාගේ පැත්තෙන් jQ තරම් සර්වසම්පූර්ණයි. මට දැනටමත් අවධාරනය කිරීමට අවශ්‍ය වී ඇති නමුත් එයට මෙම ශ්‍රිතය ඇති බව අවබෝධ නොවීය
rw-nandemo

5
අන්ඩර්ස්කෝර් ලොඩාෂ් සමඟ ප්‍රතිස්ථාපනය වේ. ඒ වෙනුවට එය භාවිතා කරන්න.
demisx

2
දිනය වර්ග සමඟ ප්‍රවේශම් වන්න, isEmpty සෑම විටම දිනය සඳහා සත්‍ය වේ, github.com/jashkenas/underscore/issues/445
mentat

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

http://bencollier.net/2011/04/javascript-is-an-object-empty/ බලන්න


5
ඔබ සැලකිලිමත් වන්නේ නම්, ගණන් කළ නොහැකි ගුණාංග මෙයට ඇතුළත් වේ.

Object.getOwnPropertyNames ({}) දිග (for ... in ...) විකල්පයට වඩා 10 ගුණයකින් මන්දගාමී වේ - මම යෝජනා කරන්නේ එය හිස් එකක් දැයි පරීක්ෂා කිරීමේ ක්‍රමයක් ලෙස එය වළක්වා ගැනීමට ය.
davidhadas

4
Object.getOwnPropertyNames(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

80

JSON.stringify භාවිතා කරන්නේ කෙසේද? එය සියලුම නවීන බ්‍රව්සර්වල පාහේ ලබා ගත හැකිය.

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

23
return (JSON.stringify (obj) == '{}')
Vic

26
මේ ආකාරයේ උපයෝගීතාව සඳහා මෙය මන්දගාමී හා වේගවත් කාරණා වේ. ඉක්මන් පරිපූර්ණ

1
මෙය ඉතා මන්දගාමී විකල්පයකි - ඒ වෙනුවට (for ... in) විකල්පය භාවිතා කිරීමට මම යෝජනා කරමි
davidhadas

2
තවද එය කාර්යයන් අඩංගු වස්තු සඳහා ක්‍රියා නොකරයි.
ෆීලික්ස් ක්ලින්ග්

1
වස්තුවෙහි චක්‍රලේඛ සඳහනක් තිබේ නම් එය දෝෂයක් ද දමනු ඇත. එබැවින් එය මන්දගාමී, විශ්වාස කළ නොහැකි වන අතර දෝෂ විසි කර අනෙක් සියල්ල බිඳ දැමිය හැකිය. එය කිසි විටෙකත් භාවිතා කිරීමට හේතුවක් නැත.
බුරාක්

62

මම ඒ හා සමාන තත්වයකට දිව ගියෙමි. මට JQuery භාවිතා කිරීමට අවශ්‍ය නොවූ අතර පිරිසිදු ජාවාස්ක්‍රිප්ට් භාවිතයෙන් මෙය කිරීමට මට අවශ්‍ය විය.

මම කළේ, පහත දැක්වෙන කොන්දේසිය භාවිතා කිරීම, එය මට වැඩ කළේය.

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

සමාන නොවන නිසා, මෙය භාවිතා කරන්න: JSON.stringify(obj) !== '{}'

මෙම JSFiddle බලන්න


4
JSON.stringify ලෙස චක්‍රලේඛ යොමු සහිත වස්තූන් සඳහා අසමත් වනු ඇත.
පේද්‍රෝ මොන්ටොටෝ ගාර්ෂියා

1
Ed PedroMontotoGarcía හරි, හිස් වස්තුවකට රවුම් සඳහනක් වන්නේ කෙසේද?
KthProg

8
වස්තුව හිස් නොවේ නම් (එය ඔවුන්ටද වැඩ කළ යුතුය).
පේද්‍රෝ මොන්ටොටෝ ගාර්ෂියා

මෙය දැනටමත් ඇටෙස්කි විසින් සඳහන් කර ඇති බව පෙනේ. එය වස්තුවක් හිස් නොවේ දැයි පරීක්ෂා කිරීමේ මන්දගාමී ක්‍රමයකි.
cwadding

ඔහ් ඔව් .. මට එය මඟ හැරුණි. මම මෙම ජාවාස්ක්‍රිප්ට් සාක්ෂාත් කර ගැනීමට අවශ්‍ය තත්වයකට දිව ගිය අතර, මඳක් කල්පනා කිරීමෙන් පසු මම මේ ආකාරයෙන් හදුනා ගතිමි. Tes ආටෙස්කි, මම ඔබ කළ ආකාරයට වුවද. :-) Btw, මේ සම්බන්ධයෙන් පිළිතුරු ගොඩක් තිබුන නිසා මට ඔබේ පිළිතුර මග හැරුණි.
අනීෂ් නයාර්

60

පරණ ප්‍රශ්නය, නමුත් ගැටලුව තිබුනි. ඔබේ එකම අරමුණ වස්තුව හිස් නොවේ දැයි පරීක්ෂා කිරීම නම් JQuery ඇතුළත් කිරීම ඇත්තෙන්ම හොඳ අදහසක් නොවේ. ඒ වෙනුවට, JQuery කේතයට ගැඹුරින් යන්න , එවිට ඔබට පිළිතුර ලැබෙනු ඇත:

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

5
මෙය ප්‍රයෝජනවත් වන්නේ වෙනත් ක්‍රියාවලියක් ඔබේ මූලික වස්තුවට මූලාකෘතියක් එකතු කර නොමැති නම් පමණි. මෙය සැබවින්ම ක්‍රියාත්මක කිරීමට නම්, ඔබ obj.hasOwnProperty (නම) සඳහා පරීක්ෂා කළ යුතුය
mpemburn

1
මෙය 2009 සිට ක්‍රිස්ටෝෆ්ගේ පිළිතුරට කිසිවක් එකතු නොකරයි .
ඩෑන් ඩස්කල්ස්කු

39

ඔබ නව බ්‍රව්සරයක සිටී නම් සරල ක්‍රමයක් තිබේ. Object.keys(obj).length == 0


1
මෙම ස්ථානය ද keysදේපල ආවේ?


1
ඉහත අදහස් දැක්වීමට උඩුකුරු 4 ක් තිබිය හැක්කේ කෙසේද? ඔව්, Object.keysසම්මත ක්‍රමයක් වන නමුත් වස්තූන්ට යතුරු දේපලක් නොමැත. එබැවින් මෙම කේතය ඕනෑම වස්තුවක් හිස් යැයි වාර්තා කරනු ඇත, එය අහම්බෙන් keyවටිනාකමක් ඇති දේපලක් තිබීම හැර නැවත lengthශුන්‍ය නොවන දේපලක් ලෙස නම් කරයි. භයානකයි!
scravy

Object.keys(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

11
cscravy Object යනු පන්ති වස්තුවයි. වස්තුවට තර්කයක් ලෙස පිළිගන්නා 'යතුරු' නම් ස්ථිතික ක්‍රමයක් ඇත. මෙම ක්‍රමය මඟින් නූල් දේපල නම් වන නූල් සමූහයක් ලබා දෙයි. developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/...
Sgnl

38

කාර්ය සාධනය

අද 2020.01.17 තෝරාගත් විසඳුම් සඳහා මම මැක් ඕස් හයිසෙයිරා 10.13.6 ක්‍රෝම් v79.0, සෆාරි v13.0.4 සහ ෆයර්ෆොක්ස් v72.0 මත පරීක්ෂණ සිදු කරමි.

නිගමන

  • for-in(A, J, L, M) මත පදනම් වූ විසඳුම් වේගවත්ම වේ
  • JSON.stringify(B, K) මත පදනම් වූ විසඳුම් මන්දගාමී වේ
  • පුදුමයට කරුණක් නම් Object(N) මත පදනම් වූ විසඳුම මන්දගාමී වීමයි

රූප විස්තරය මෙහි ඇතුළත් කරන්න

විස්තර

ස්නිපටයේ පහත විසඳුම් 15 ක් ඉදිරිපත් කෙරේ. ඔබේ යන්ත්‍රයේ කාර්ය සාධන පරීක්ෂණය ක්‍රියාත්මක කිරීමට අවශ්‍ය නම් මෙතැන ක්ලික් කරන්න .

රූප විස්තරය මෙහි ඇතුළත් කරන්න


මෙයින් බොහොමයක් තේරුමක් නැති නිසා ඔබ සියල්ල පදනම් කර ගෙන ඇත්තේ අසත්‍ය හෝ සත්‍යය ය. සමහර විට ක්‍රමලේඛයට if ප්‍රකාශයක් හෝ ත්‍රිමාණ ක්‍රියාකරුවෙකු අවශ්‍ය වේ. just fyi
ක්‍රිස්තියානි මැතිව්

1
එය හොඳම පිළිතුරයි, ස්තූතියි, පළමු විසඳුම චමත්කාරයක් මෙන් ක්‍රියා කරයි
කාලෝස් ජේසුස් අරන්සිබියා ටබෝර්ගා

1
සම්පූර්ණත්වය සඳහා, මම ඔබේ jsperf පරීක්‍ෂා කිරීම සඳහා සංස්කරණය කළ obj = {a:1,b:2,c:3}අතර for(var i in obj)එය තවමත් වේගවත්ම jsperf.com/object-empty-ch/2
මැඩකොල්

33

Object.keys (obj) භාවිතා කිරීම. දිග (ECMA 5+ සඳහා ඉහත යෝජනා කර ඇති පරිදි) හිස් වස්තු සඳහා 10 ගුණයක් මන්දගාමී වේ! පැරණි පාසල (සඳහා ... සඳහා) විකල්පය සමඟ තබා ගන්න.

Node, Chrome, Firefox සහ IE 9 යටතේ පරීක්ෂා කර ඇති විට, බොහෝ භාවිත අවස්ථා සඳහා:

  • (for ... in ...) යනු වේගවත්ම විකල්පයයි!
  • Object.keys (obj). හිස් වස්තූන් සඳහා දිග 10 ගුණයකින් මන්දගාමී වේ
  • JSON.stringify (obj). දිග සෑම විටම මන්දගාමී වේ ( අධිපති නොවේ)
  • Object.getOwnPropertyNames (obj) .එය දිග Object.keys (obj) ට වඩා වැඩි කාලයක් ගතවේ .එම පද්ධතිවල දිග බොහෝ දිගු විය හැකිය.

පහළ පේළියේ ක්‍රියාකාරිත්වය නැණවත් ලෙස, භාවිතා කරන්න:

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

විස්තරාත්මක පරීක්ෂණ ප්‍රති results ල සහ පරීක්ෂණ කේතය බලන්න වස්තුව හිස්ද?


Object.keysමන්දගාමී නමුත් අඩු කේතයකි. කුඩා පිටුවක, මෙය හැඳින්වෙන ස්ථානය ... සමහර විට 10 වතාවක් විය හැකිය ... අතිරේක කේතයේ අමතර විග්‍රහ කිරීමේ කාලය සලකා බැලීමේදී මෙය තවමත් මන්දගාමී වේද?
යැන්කි

32

ඔබට වස්තු යතුරු ගණන පරීක්ෂා කළ හැකිය:

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

8
දැනටමත් ලබා දී ඇති පිළිතුරක් සඳහා ඔබ අදහස් දැක්වීමක් එකතු කර ඊට වඩා නරක පිළිතුරක් දෙන්නේ ඇයි? stackoverflow.com/a/32108184/4229159 සහ එය අප්‍රේල් මාසයේ
ඇලෙජැන්ඩ්‍රෝ වේල්ස්

මා සතුව ඉතා විශාල වස්තුවක් තිබේ නම් සහ එම වස්තුව හිස් දැයි බැලීමට එක් එක් ලූපය මත එය කරන්නේ කෙසේද?
ස්ටෙෆාන්ස් ආර්යා

27
  1. නිකම්ම වැඩ කරන්න. දත්ත නොමැති අවස්ථාවකදී ඔබේ සේවාදායකයාට විශේෂ දේපලක් ජනනය කළ හැකිද?

    උදාහරණයක් වශයෙන්:

    var a = {empty:true};

    එවිට ඔබට එය පහසුවෙන් ඔබේ AJAX ඇමතුම් කේතයෙන් පරීක්ෂා කළ හැකිය.

  2. එය පරීක්ෂා කිරීමට තවත් ක්‍රමයක්:

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

සංස්කරණය කරන්න : ඔබ කිසියම් JSON පුස්තකාලයක් (fe JSON.js) භාවිතා කරන්නේ නම් ඔබට JSON.encode () ශ්‍රිතය උත්සාහ කර හිස් අගය නූලට එරෙහිව ප්‍රති result ලය පරීක්ෂා කළ හැකිය.


6
toSource()සම්මත නොවන අතර එය IE හෝ ඔපෙරා වල ක්‍රියා නොකරයි (සහ මම පරීක්ෂා නොකළ වෙනත් බ්‍රව්සර්)
ක්‍රිස්ටෝෆ්

4
VThevs: සමහර විට ඔබ සතුව ECMA-262 හි වර්තමාන අනුවාදයේ වෙනස් පිටපතක් ඇත, නමුත් මගේ toSourceදේපල 15.2.4 වගන්තියේ ලැයිස්තුගත නොකරයි ; MDC ට අනුව, එය JS1.3 (එනම් නෙට්ස්කේප් නැවිගේටර් 4.06) හි හඳුන්වා දී ඇත, නමුත් එය 3 වන සංස්කරණයේ ECMA-262 හි නොමැත!
ක්‍රිස්ටෝෆ්

4
V ඔවුන්: හොඳයි, අවම වශයෙන් වැදගත් බ්‍රව්සර් වෙළෙන්දන් දෙදෙනෙකු වත් එය ක්‍රියාත්මක කර නැත, එබැවින් එය තථ්‍ය ප්‍රමිතියක් නොවන අතර එය ECMA-262 හි නොමැති බැවින් එය සැබෑ එකක් නොවේ ...
ක්‍රිස්ටෝෆ්

4
එය ක්‍රියාත්මක වන විට පවා toSource()මෙය කිරීමට භයානක ක්‍රමයකි (පවතින ආකාරයට JSON.encode()). එය හිස් දැයි පරීක්ෂා කිරීම සඳහා ඔබේ සමස්ත වස්තුව නියෝජනය කරන නූලක් සෑදිය යුතුය. දේවල් නූල් බවට පරිවර්තනය කිරීමේ පොදු කාර්යයක් ඇත, නමුත් එපමණක් නොව ඔබේ වස්තුවට දේපළ මිලියනයක් තිබේ නම් එය මිලියනයක් පරිවර්තනය කිරීමට අවශ්‍ය වනු ඇත, ඇත්ත වශයෙන්ම එකක් දෙස බැලීමෙන් එය හිස් නොවන බව ඔබට දැනගත හැකිය.
ජැස්පර්

4
H උඩිස් එක විශාල වුවත්, එය විශාලත්වයේ අනුපිළිවෙලින් වුවද (එය සෑම තත්වයක් යටතේම මට විශ්වාස නැත). කෙසේ වෙතත්, එම පිළිතුරට වෙනස් දේපලක් සොයාගත් විගසම බොරු ආපසු යැවීම ඇතුළත් වන අතර එමඟින් කතාව සියල්ලම වෙනස් වේ ...
ජැස්පර්

25

වස්තුව හිස් දැයි තීරණය කිරීම සඳහා මම සම්පූර්ණ ශ්‍රිතයක් නිර්මාණය කර ඇත්තෙමි.

එය භාවිතා කරයි Object.keysසිට සම්මතයන් 5 හොඳම කාර්ය සාධනය (බලන්න සාක්ෂාත් කර ගැනීම හැකි නම් (ES5) ක්රියාකාරීත්වය ගැළපුම වගුව පැරණි එන්ජින් (බ්රව්සර) සඳහා වඩාත්ම ගැලපෙන ප්රවේශය) සහ fallbacks.

විසඳුමක්

/**
 * 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 නිරූපණය සහ සරල පරීක්ෂණයක් සමඟ.

එය යමෙකුට උපකාරී වනු ඇතැයි මම බලාපොරොත්තු වෙමි. චියර්ස්!


3
මෙය අසමත් වේ null වස්තුවක් .

හායි ora ටෝරාසාබුරෝ! දැනුම්දීමකට ස්තූතියි! නිවැරදි ක්‍රියාත්මක කිරීමකින් මම සියලු ප්‍රභවයන් යාවත්කාලීන කර ඇත්තෙමි.
ස්ලාවා ෆොමින් II

1
Object.keys ({}). දිග (සඳහා ... සඳහා ...) විකල්පයට වඩා 10 ගුණයකින් මන්දගාමී වේ - මම යෝජනා කරන්නේ එය හිස් එකක් දැයි පරීක්ෂා කිරීමේ ක්‍රමයක් ලෙස එය වළක්වා ගැනීමට ය.
davidhadas

1
Object.keys(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

19

මම මෙය භාවිතා කරමි.

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

හායි. ඔබ මෙම ශ්‍රිතය අංකය හෝ බූලියන් සත්‍ය හෝ ව්‍යාජ ප්‍රතිලාභ සත්‍ය ලෙස පරීක්ෂා කරන විට මෙය නිවැරදි ප්‍රති .ලයක් නොවේ. isObjectEmpty (සත්‍ය). isObjectEmpty (අසත්ය). isObjectEmpty (1)
ඉමාන්

2
අප පරීක්ෂා කරන්නේ වස්තුව හිස්ද යන්න මිස දත්ත වර්ගය වස්තුවක් නොවේද යන්නයි. ඔබගේ නඩුවේ වස්තුවක් තිබේදැයි පරීක්ෂා කර බැලීමට අපට අවශ්‍ය නම් (typeof a === "object") {...}
kiranvj

15

පහත උදාහරණයෙන් දැක්වෙන්නේ ජාවාස්ක්‍රිප්ට් වස්තුවක් හිස් දැයි පරීක්ෂා කරන්නේ කෙසේද යන්නයි.

ස්ක්‍රිප්ට් එක 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


15

Object.entries () හි ES2017 පිරිවිතරයට අනුව , ඕනෑම නවීන බ්‍රව්සරයක් භාවිතයෙන් චෙක්පත සරලයි -

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

3
එහි ඒ කට භාවිතා කිරීමට කිසිදු ප්රතිලාභයක් වේ Object.keysහෝ Object.values?
faintsignal

ainFaintsignal භාවිතා කිරීම ඉතා හොඳයි. අදහස් දැක්වීමේදී සොයාගත නොහැකි ලෙස මම ඇතුළත් කිරීම් එක් කළෙමි.
වික්‍රන්ත්

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

4
නිදසුනක් ලෙස, ජාවාස්ක්‍රිප්ට් පුස්තකාලයක් Objectමූලාකෘති දාමය හරහා ක්‍රමවේදයක් සමඟ විහිදෙන විට එය සත්‍යයක් ලෙස වාර්තා වනු ඇත , මන්ද එය ගණන් කළ නොහැකි වන අතර for inප්‍රකාශය ගණන් කළ නොහැකි ගුණාංග හරහා ලූප වේ.
viam0Zah

12

jQuery isEmptyObject()සඳහා මෙම නඩුවේ විශේෂ කාර්යයක් ඇත:

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

Http://api.jquery.com/jQuery.isEmptyObject/ පිළිබඳ වැඩිදුර කියවන්න


12

එහි අවම වශයෙන් එක් යතුරක්වත් තිබේදැයි පරීක්ෂා කිරීමට මම යන්නෙමි. එය හිස් නොවන බව මට පැවසීමට එය ප්‍රමාණවත් වේ.

typeof obj !== "undefined" && Boolean(Object.keys(obj)[0])

1
පළමු යතුර ප්‍රතිලාභ falseඅගය කරන්නේ නම් කුමක් කළ යුතුද? ප්‍රති result falseලය වැරදියි.
ජිමී ඔබොනියෝ ඇබෝර්

මම ඒ සඳහා අත්හදා බැලුවෙමි. ඔබට වැඩ කරන උදාහරණයක් දිය හැකිද?
ටියුඩර් මොරාර්

1
මෙය කෙටි හා සංක්ෂිප්ත ය, නමුත් වස්තුව නිර්වචනය කර නොමැති නම් ධාවන කාල දෝෂයක් ඇති වනු ඇත
Mrinmoy

11

කබාය යටතේ සියලුම පුස්තකාලවල ඇති හිස් චෙක්පත් ක්‍රම මඟින් තර්කන පරික්ෂා කිරීමේ වස්තු යතුරු භාවිතා කරයි. එය තේරුම් ගත හැකි අමුතුම ක්‍රමයක් වන අතර, ඔබට ක්‍රමවේදයක් ඉදිරිපත් කළ හැකිය, මෙහි විස්තර කර ඇත .

for(key in obj){
   //your work here.
 break;
}

එය ES5 හි පරිණාමය වී ඇති අතර , දැන් සරලව කිවහොත් Object.Keysඔබේ වස්තුව පරාමිතිය ලෙස ගෙන යන ක්‍රමය භාවිතා කරමින් වස්තුවේ යතුරු දිග පරීක්ෂා කළ හැකිය :

if(Object.keys(obj).length > 0){
 //do your work here
}

නැතහොත් ඔබ ලොඩාෂ් භාවිතා කරන්නේ නම් (ඔබ විය යුතුය) එවිට.

 _.isEmpty(obj) //==true or false

ප්‍රකාශයක් කිරීමේ අමුතු ක්‍රමයක් ලෙස එය නිවැරදි වුවත් - එය ඔබට පසුව කේතය පවත්වාගෙන යන අයෙකු ව්‍යාකූල කරනු ඇත.
සෝරන්

10


ඔබට jQuery හෝ වෙනත් පුස්තකාල භාවිතා නොකළ මෙම සරල කේතය භාවිතා කළ හැකිය

var a=({});

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

JSON පන්තිය සහ එහි ක්‍රියාකාරිත්වය ( විග්‍රහ කිරීම සහ දැඩි කිරීම ) ඉතා ප්‍රයෝජනවත් නමුත් 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

JSON.stringifyවස්තුවෙහි ශ්‍රිත හෝ “නිර්වචනය නොකළ” වැනි දැඩි නොවන ගුණාංග අඩංගු නම් විසඳුම අසමත් වේ.

10

මා සොයාගත් හොඳම ක්‍රමය:

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

3
0 ඇත්ත වශයෙන්ම සංඛ්‍යාවක් බැවින් එය හිස් නොවන බව මම කියමි. අනෙක් සියල්ල හොඳ පෙනුමක් ඇති නමුත් නිවැරදි කිරීම පහසුය. පළමු ප්‍රකාශයේ මෙය එකතු කරන්න. if (!obj && obj !== 0).
mjwrazor

9

මම ගන්න:

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()දැනට ක්‍රියාත්මක වන බව මම නොසිතමි .


2
Object.keys(new Date()).length === 0; එබැවින් මෙම පිළිතුර නොමඟ යවන සුළු විය හැකිය.
cjbarth

3
යතුරු නිරාවරණය නොකළද දිනය සැමවිටම “පිරී” ඇති බව ඔබ සලකන්නේ නම් එය රඳා පවතී. නමුත් එය ඔබගේ සැලැස්ම නම්, දිනය සාදන්නා සඳහා අතිරේක උදාහරණ චෙක්පතක් එක් කිරීම හොඳ විකල්පයක් බව මම එකඟ වෙමි.
NiKo

9

JQuery සහ වෙබ් බ්‍රව්සරය නොමැති නම්, underscore.js හි isEmpty ශ්‍රිතයක් ද ඇත.

_.isEmpty({}) // returns true

මීට අමතරව, එය ආදාන පරාමිතිය වස්තුවක් ලෙස උපකල්පනය නොකරයි. ලැයිස්තුවක් හෝ නූලක් හෝ නිර්වචනය කර නොමැති නම්, එය නිවැරදි පිළිතුර ද හරවනු ඇත.



8

නිවැරදි පිළිතුර:

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

මෙය පරීක්ෂා කරන්නේ:

  • වස්තුවට තමන්ගේම ගුණාංග නොමැත (ගණන් කිරීමේ හැකියාව නොසලකා).
  • වස්තුවට තමන්ගේම දේපල සංකේත නොමැත.
  • වස්තුවේ මූලාකෘතිය හරියටම Object.prototypeවේ.

වෙනත් වචන වලින් කිවහොත්, වස්තුව නිර්මාණය කරන ලද එකකින් වෙන් කොට හඳුනාගත නොහැකිය {}.


7

අවවාදය! 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 ) );

දර්ශන

    පරෙස්සම් වන්න !! obj හිස් නොවේ!

    obj = {f: ශ්‍රිතය () {}}

    JSON.stringify (obj)

    ප්‍රතිලාභ

    {}

6

තේව්ස් පිළිතුරට අමතරව:

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

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

එය jquery + jquery.json


මම JSON භාවිතා කිරීමට කැමති නැත, එයට රවුම් වස්තු ව්‍යුහයන් සමඟ ක්‍රියා කළ නොහැක.
itdoesntwork

2
ඔබේ පිටුව jQuery පටවා ඇත්නම් භාවිතා කරන්න $.isEmptyObject(), පැහැදිලි නොවන පරිවර්තනයන් සමඟ චක්‍ර නාස්ති නොකරන්න.
skierpage

6

Sugar.JS මේ සඳහා දීර් extended වස්තු සපයයි. කේතය පිරිසිදු හා සරල ය:

දීර් object වස්තුවක් සාදන්න:

a = Object.extended({})

එහි ප්‍රමාණය පරීක්ෂා කරන්න:

a.size()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.