ජාවාස්ක්‍රිප්ට් හි ඇති වස්තුවක යතුරු / ගුණාංග ගණන කාර්යක්ෂමව ගණනය කරන්නේ කෙසේද?


1566

වස්තුවක යතුරු / ගුණාංග ගණන ගණනය කිරීමට වේගවත්ම ක්‍රමය කුමක්ද? වස්තුවට වඩා පුනරාවර්තනයකින් තොරව මෙය කළ හැකිද? එනම් නොකර

var count = 0;
for (k in myobj) if (myobj.hasOwnProperty(k)) count++;

(ෆයර්ෆොක්ස් විසින් මැජික් __count__දේපලක් ලබා දී ඇත, නමුත් මෙය 4 වන අනුවාදය වටා කොතැනක හෝ ඉවත් කරන ලදි.)



2
විවිධ ක්‍රම සඳහා කාර්ය සාධන මිණුම් ලකුණක්: jsben.ch/#/oSt2p
EscapeNetscape

Answers:


2551

Node , Chrome, IE 9+, Firefox 4+, හෝ Safari 5+ වැනි ඕනෑම ES5 අනුකූල පරිසරයක මෙය සිදු කිරීම සඳහා :

Object.keys(obj).length

8
Node.js පමණක් නොව, ES5 සඳහා සහය දක්වන ඕනෑම පරිසරයක්
Yi Jiang

59
BTW ... පරීක්ෂණ කිහිපයක් පමණක් පවත්වා ඇත ... මෙම ක්‍රමය O (n) කාලය තුළ ක්‍රියාත්මක වේ. A for loop මෙම ක්‍රමයට වඩා නරක නැත. ** දුක්බර මුහුණ ** stackoverflow.com/questions/7956554/…
BMiner

162
-1 (-200 මට හැකි නම්) මෙය වස්තුව හරහා පුනරාවර්තනය වනවා පමණක් නොව, එහි සියලු යතුරු සමඟ නව අරාවක් නිර්මාණය කරයි, එබැවින් එය ප්‍රශ්නයට පිළිතුරු දීමට සම්පූර්ණයෙන්ම අසමත් වේ.
GetFree

42
(අවම වශයෙන් Chrome 25 හි) කිරීමට වඩා එය වේගවත් බව පෙනේ: jsperf.com/count-elements-in-object
fserb

35
EtGetFree ඇයි මෙතරම් විශාල ප්‍රමාණයක්? මෙය නියත වශයෙන්ම කේතීකරණයේ වේගවත්ම ක්‍රමයයි. අමතර ක්‍රම හෝ පුස්තකාල අවශ්‍ය නොවේ. කේත වේගය අනුව, පෙනෙන හැටියට එය ද එතරම් නරක නැත. සම්පුර්ණයෙන්ම අසමත් නොවේ. මාපට ඇඟිල්ල 87 ඔබ වෙනුවෙන් අසමත් වේ.
ඇන්ඩෲ

151

ඔබට මෙම කේතය භාවිතා කළ හැකිය:

if (!Object.keys) {
    Object.keys = function (obj) {
        var keys = [],
            k;
        for (k in obj) {
            if (Object.prototype.hasOwnProperty.call(obj, k)) {
                keys.push(k);
            }
        }
        return keys;
    };
}

එවිට ඔබට මෙය පැරණි බ්‍රව්සර්වලද භාවිතා කළ හැකිය:

var len = Object.keys(obj).length;

2
චෙක්පතෙහි අරමුණ (Object.prototype.hasOwnProperty.call(obj, k))කුමක්ද?
ස්ටයිෆල්

14
ystyfle ඔබ වස්තුවේ ගුණාංග නැවත ප්‍රකාශ කිරීම සඳහා a for loop එකක් භාවිතා කරන්නේ නම් , ඔබට ද මූලාකෘති දාමයේ ගුණාංග ලැබේ. පරීක්ෂා hasOwnPropertyකිරීම අත්‍යවශ්‍ය වන්නේ එබැවිනි . එය ආපසු ලබා දෙන්නේ වස්තුව මත පිහිටුවා ඇති ගුණාංග පමණි.
රෙනාට් ද මුයින්ක්

14
@styfle එය සරල කිරීම සඳහා ඔබට ලිවිය හැකිය obj.hasOwnProperty(k)(මම මෙය ඇත්ත වශයෙන්ම මගේ මුල් පෝස්ට් එකේ කළෙමි, නමුත් පසුව එය යාවත්කාලීන කළෙමි). hasOwnPropertyසෑම වස්තුවකම එය ලබා ගත හැක්කේ එය Objectමූලාකෘතියේ කොටසක් වන නමුත් දුර්ලභ අවස්ථාවකදී මෙම ක්‍රමය ඉවත් කිරීම හෝ අභිබවා යාම ඔබට අනපේක්ෂිත ප්‍රති .ල ලබා ගත හැකිය. එයින් ඇමතීමෙන් එය Object.prototypeතව තවත් ශක්තිමත් වේ. භාවිතා කිරීමට හේතුව callවන්නේ objමූලාකෘතිය වෙනුවට ක්‍රමවේදය ක්‍රියාත්මක කිරීමට ඔබට අවශ්‍ය වීමයි .
රෙනාට් ද මුයින්ක්

6
මෙම අනුවාදය භාවිතා කිරීම වඩා හොඳ නොවේද? developer.mozilla.org/en-US/docs/JavaScript/Reference/...
සේවියර් Delamotte

1
AvXavierDelamotte ඔබ නියත වශයෙන්ම නිවැරදි ය. මගේ අනුවාදය ක්‍රියාත්මක වන අතර, එය උදාහරණයක් ලෙස ඉතා මූලික හා මානසික ය. මොසිල්ලාගේ කේතය වඩාත් ආරක්ෂිතයි. (PS: ඔබේ සබැඳිය ද පිළිගත් පිළිතුරේ ඇත)
Renaat De Muynck

138

ඔබ Underscore.js භාවිතා කරන්නේ නම් ඔබට _.size භාවිතා කළ හැකිය (ස්තූතියි ou ඩව්):
_.size(obj)

විකල්පයක් ලෙස ඔබට සමහර අයට වඩා පැහැදිලි විය හැකි _.keys භාවිතා කළ හැකිය:
_.keys(obj).length

මූලික දේ රාශියක් කිරීම සඳහා එහි තද පුස්තකාලයක් වන අන්ඩර්ස්කෝර් මම තරයේ නිර්දේශ කරමි. හැකි සෑම විටම ඒවා ECMA5 සමඟ ගැලපෙන අතර ස්වදේශීය ක්‍රියාත්මක කිරීමට කල් දමයි.

නැතිනම් මම අවීගේ පිළිතුරට සහය දෙමි. ECMA5 නොවන බ්‍රව්සර් වලට ඔබට එකතු කළ හැකි යතුරු () ක්‍රමය ඇතුළත් වන MDC ලේඛනයට සබැඳියක් එක් කිරීමට මම එය සංස්කරණය කළෙමි.


9
ඔබ underscore.js භාවිතා කරන්නේ නම් ඒ වෙනුවට _.size භාවිතා කළ යුතුය. හොඳ දෙය නම්, ඔබ කෙසේ හෝ අරාව සිට වස්තුව වෙත මාරු වුවහොත් හෝ අනෙක් අතට ප්‍රති result ලය එලෙසම පැවතීමයි.
douwe

2
මගේ අවබෝධයෙන් ලොඩාෂ් සාමාන්‍යයෙන් අවධාරනය කිරීමට වඩා හොඳයි (ඔවුන් සමාන දේ කළත්).
මර්ලින් මෝගන්-ග්‍රැහැම්

1
@ මර්ලින් මෝර්ගන්-ග්‍රැහැම් මට නිවැරදිව සිහිපත් කළහොත්, ලොඩාෂ් මුලින් අවධාරනය කළ
දෙබලකි

6
_.keys(obj).lengthමට ආපසු වැඩ කරන වස්තුව සමහර විට එහි කිසිදු ගුණාංගයක් නොමැති සරල නූලක් වන නිසා මට වඩාත්ම සුදුසු විය. _.size(obj)මට නැවත නූල් වල දිග ලබා දෙන අතර _.keys(obj).length0 ආපසු එයි.
ජේකබ් ස්ටෑම්

O (n) සංකීර්ණතාව . ලොඩාෂ් සහ අන්ඩර්ස්කෝර් Object.keysඅභ්‍යන්තරව භාවිතා කරයි . අන්ඩර්ස්කෝර් අර්ථ දක්වා නොමැති for..inනම් Object.keysසෑම යතුරක්ම ලූපයක් තුළ ඇති අරාවකට පිටපත් කරයි .
එන්. කුද්‍රියව්ට්සෙව්

82

සම්මත වස්තු ක්‍රියාත්මක කිරීම ( ES5.1 වස්තු අභ්‍යන්තර ගුණාංග සහ ක්‍රම ) සඳහා Objectඑහි යතුරු / ගුණාංග ගණන සොයා ගැනීමට අවශ්‍ය නොවේ , එබැවින් Objectඑහි යතුරු පැහැදිලිව හෝ ව්‍යංගයෙන් නොකියවා එහි ප්‍රමාණය තීරණය කිරීමට සම්මත ක්‍රමයක් නොතිබිය යුතුය .

එබැවින් වඩාත් බහුලව භාවිතා වන විකල්ප මෙන්න:

1. ECMAScript හි Object.keys ()

Object.keys(obj).length;තාවකාලික අරාව ගණනය කිරීම සඳහා යතුරු හරහා අභ්‍යන්තරව පුනරාවර්තනය කිරීමෙන් ක්‍රියා කරන අතර එහි දිග නැවත ලබා දේ.

  • වාසි - කියවිය හැකි සහ පිරිසිදු සින්ටැක්ස්. ස්වදේශීය සහාය නොමැති නම් ෂිම් එකක් හැර පුස්තකාලයක් හෝ අභිරුචි කේතයක් අවශ්‍ය නොවේ
  • අවාසි - අරාව නිර්මාණය කිරීම නිසා මතකය ඉහළින්.

2. පුස්තකාල පදනම් කරගත් විසඳුම්

මෙම මාතෘකාවේ වෙනත් තැනක ඇති පුස්තකාල පදනම් කරගත් බොහෝ උදාහරණ ඔවුන්ගේ පුස්තකාලයේ සන්දර්භය තුළ ප්‍රයෝජනවත් මෝඩයන් වේ. කෙසේ වෙතත්, කාර්ය සාධන දෘෂ්ටි කෝණයකින්, පරිපූර්ණ පුස්තකාල Object.keysරහිත කේතයකට සාපේක්ෂව ලබා ගත හැකි කිසිවක් නැත, මන්ද එම පුස්තකාල ක්‍රම සියල්ලම ඇත්ත වශයෙන්ම ලූප් සඳහා හෝ ඊඑස් 5 (ස්වදේශීය හෝ දිලිසෙන) සමඟ සංයුක්ත වේ.

3. ලූපයක් ප්‍රශස්ත කිරීම

මෙම මන්දගාමී වේ කොටසක් සඳහා-පුඩුවක් එවැනි පොදුවේ යනු .hasOwnProperty()ඒ function ඇමතුමක් සෝපානත්, ඇමතුම. එබැවින් මට JSON වස්තුවක ඇතුළත් කිරීම් ගණන අවශ්‍ය වූ විට, .hasOwnProperty()කිසිදු කේතයක් හෝ දීර් Object.prototype. නොවන බව මා දන්නේ නම් මම ඇමතුම මඟ හරින්නෙමි .

එසේ නොමැතිනම්, kදේශීය ( var k) සෑදීමෙන් සහ ++countපෝස්ට්ෆික්ස් වෙනුවට උපසර්ග වර්ධක ක්‍රියාකරු ( ) භාවිතා කිරීමෙන් ඔබේ කේතය තරමක් ප්‍රශස්ත කළ හැකිය .

var count = 0;
for (var k in myobj) if (myobj.hasOwnProperty(k)) ++count;

තවත් අදහසක් රඳා පවතින්නේ hasOwnPropertyක්‍රමවේදය හැඹිලිගත කිරීම මත ය :

var hasOwn = Object.prototype.hasOwnProperty;
var count = 0;
for (var k in myobj) if (hasOwn.call(myobj, k)) ++count;

දී ඇති පරිසරයක මෙය වේගවත් ද නැද්ද යන්න මිණුම් සලකුණු කිරීමේ ප්‍රශ්නයකි. කෙසේ වෙතත් ඉතා සීමිත කාර්ය සාධන ලාභයක් අපේක්ෂා කළ හැකිය.


var k in myobjකාර්ය සාධනය වැඩි කරන්නේ ඇයි ? මා දන්නා පරිදි, ජාවාස්ක්‍රිප්ට් හි නව විෂය පථය ප්‍රකාශ කරන්නේ කාර්යයන් පමණි. ලූප මෙම රීතියට ව්‍යතිරේකයක්ද?
ලාර්ස් ගයිරප් බ්‍රින්ක් නීල්සන්

1
මෙය වේගවත්ද? for (var k in myobj) hasOwn.call(myobj, k) && ++count;එනම් if ප්‍රකාශය සරල && වෙනුවට ආදේශ කිරීම?
හම්සා කුබ්බා

ඔබට කළ හැකි අවසාන දේ : Object.getOwnPropertyNames(obj).length; වඩා සරලයි.
විල්ට්

29

ඔබ සැබවින්ම කාර්ය සාධන ගැටලුවකට මුහුණ දෙන්නේ නම්, නිසි ලෙස නම් කරන ලද (ප්‍රමාණය?) දේපලක් වැඩි කරන / අඩු කරන ශ්‍රිතයක් සමඟ වස්තුවට / වෙතින් දේපල එකතු කරන / ඉවත් කරන ඇමතුම් එතීමට මම යෝජනා කරමි.

ඔබට අවශ්‍ය වන්නේ ආරම්භක දේපල සංඛ්‍යාව එක් වරක් පමණක් ගණනය කර එතැනින් ඉදිරියට යාමයි. සැබෑ කාර්ය සාධන ගැටලුවක් නොමැති නම්, කරදර නොවන්න. එම කේතය ටිකක් ශ්‍රිතයක් getNumberOfProperties(object)තුළට ඔතා එය සමඟ කරන්න.


4
ithitautodestruct ඔහු විසඳුමක් ඉදිරිපත් කරන නිසා.
පොඩි කරන්න

මෙම පිළිතුර සෘජු විසඳුමක් ලබා දෙනවාට වඩා කළ යුතු දේ යෝජනා කරන බව පෙනේ.
hitautodestruct

5
ithitautodestruct එයට පිළිතුරක් යෝජනා කරයි: එකතු කිරීමේ / ඉවත් කිරීමේ ක්‍රම සමඟ සංවෘත සංඛ්‍යාවක් වැඩි කිරීම / අඩු කිරීම. පහත දැක්වෙන ආකාරයට තවත් පිළිතුරක් තිබේ. එකම වෙනස නම්, ව්‍යාකූලත්වය කිසිදු කේතයක් ඉදිරිපත් නොකිරීමයි. කේත විසඳුම් පමණක් සැපයීමට පිළිතුරු අනිවාර්ය නොවේ.
පොඩි කරන්න

1
එය පරිපූර්ණ නොවිය හැකිය ... නමුත් අනෙක් "පිළිතුරු" සමඟ සසඳන විට මෙය සමහර අවස්ථාවන්ට හොඳම විසඳුම විය හැකිය
d.raev

1
මෙතෙක් මා දුටු එකම විසඳුම මෙයයි (1) නියත කාල කාර්ය සාධන සංකීර්ණතාවය, එබැවින් “නැවත සැකසීමකින් තොරව” ප්‍රශ්න විස්තරයට පිළිතුරු සපයන එකම විසඳුම එය වන අතර එය සත්‍ය ලෙස පිළිගත් පිළිතුර විය යුතුය. බොහෝ විට අනෙක් සියලුම පිළිතුරු එයට පිළිතුරු නොදෙන්නේ, ඔවුන් O (n) රේඛීය කාල කාර්ය සාධන සංකීර්ණතාවයක් ලබා දෙන බැවිනි; .keys () ශ්‍රිතයක් වැනි දෙයක් හඳුන්වන 1-පේළි විසඳුම් සඳහාද එය එසේ වේ, එවැනි ක්‍රියාකාරී ඇමතුම් O (n) වේ.
cellepo

17

අවී ෆ්ලැක්ස් ප්‍රකාශ කළ පරිදි https://stackoverflow.com/a/4889658/1047014

Object.keys(obj).length

ඔබේ වස්තුවෙහි ඇති සියළුම ගණනය කළ හැකි ගුණාංග සඳහා උපක්‍රමය කරනු ඇති අතර ඒ වෙනුවට ඔබට භාවිතා කළ හැකි ගණන් කළ නොහැකි ගුණාංග ද ඇතුළත් වේ Object.getOwnPropertyNames. මෙන්න වෙනස:

var myObject = new Object();

Object.defineProperty(myObject, "nonEnumerableProp", {
  enumerable: false
});
Object.defineProperty(myObject, "enumerableProp", {
  enumerable: true
});

console.log(Object.getOwnPropertyNames(myObject).length); //outputs 2
console.log(Object.keys(myObject).length); //outputs 1

console.log(myObject.hasOwnProperty("nonEnumerableProp")); //outputs true
console.log(myObject.hasOwnProperty("enumerableProp")); //outputs true

console.log("nonEnumerableProp" in myObject); //outputs true
console.log("enumerableProp" in myObject); //outputs true

ප්රකාශ කළ පරිදි, මෙහි මෙම එකම බ්රවුසරයට සහාය ලෙස ඇතObject.keys

කෙසේ වෙතත්, බොහෝ අවස්ථාවන්හීදී, මෙම වර්ගයේ මෙහෙයුම් සඳහා ගණන් කළ නොහැකි දෑ ඇතුළත් කිරීමට ඔබට අවශ්‍ය නොවනු ඇත, නමුත් වෙනස දැන ගැනීම සැමවිටම හොඳයි;)


1
Object.getOwnPropertyNamesමෙහි සඳහන් කිරීම සඳහා ඔබමයි ...
විල්ට්

15

මෙය සිදු කළ හැකි ක්‍රමයක් ගැන මම නොදනිමි, කෙසේ වෙතත් පුනරාවර්තනයන් අවම මට්ටමක තබා ගැනීමට, ඔබට __count__එහි පැවැත්ම පරීක්ෂා කර බැලීමට උත්සාහ කළ හැකි අතර එය නොපවතී නම් (එනම් ෆයර්ෆොක්ස් නොවේ) එවිට ඔබට වස්තුව හරහා නැවත අර්ථ දැක්විය හැකිය එය පසුව භාවිතා කිරීම සඳහා උදා:

if (myobj.__count__ === undefined) {
  myobj.__count__ = ...
}

මේ ආකාරයට ඕනෑම බ්‍රව්සරයක් සහය දක්වන අය __count__එය භාවිතා කරනු ඇති අතර, නැවත සිදුකිරීම් සිදු කරනු ලබන්නේ එසේ නොකරන අයට පමණි. ගණනය වෙනස් වී ඔබට මෙය කළ නොහැකි නම්, ඔබට එය සැමවිටම ශ්‍රිතයක් බවට පත් කළ හැකිය:

if (myobj.__count__ === undefined) {
  myobj.__count__ = function() { return ... }
  myobj.__count__.toString = function() { return this(); }
}

ඔබ myobj සඳහන් කරන ඕනෑම වේලාවක මේ ආකාරයෙන්. __count__ශ්‍රිතය ගිනිගෙන නැවත ගණනය කරනු ඇත.


13
බව සටහන Object.prototype.__count__: ගෙකෝ 1.9.3 ඉවත් කොට ඇත whereswalden.com/2010/04/06/... ගණන් -property-of-වස්තූන්-වේ-කොට-ඉවත් /
dshaw

17
දැන් ෆයර්ෆොක්ස් 4 අක්‍රිය වී ඇති බැවින් මෙම පිළිතුර දැන් යල්පැන ඇත. Object.__count__නැතිවී ගොස් ඇති අතර හොඳ ප්‍රහේලිකාවක් ද ඇත.
යී ජියැන්ග්

1
පිළිතුර යල්පැන ඇති බව මම නොකියමි. ශ්‍රිතයක අගය වටහා ගැනීම තවමත් සිත්ගන්නා උපායකි.
devios1

දිගු කිරීම සඳහා මූලාකෘති වස්තුව භාවිතා කළ යුතුය
ආරියා කාටර්-වීර්

13

Avi Flax පිළිතුර Obte.keys (obj) මත නැවත සැකසීම .එහි කාර්යයන් බැඳී නැති වස්තුවක් සඳහා දිග නිවැරදි වේ

උදාහරණයක්:

obj = {"lol": "what", owo: "pfft"};
Object.keys(obj).length; // should be 2

එදිරිව

arr = [];
obj = {"lol": "what", owo: "pfft"};
obj.omg = function(){
    _.each(obj, function(a){
        arr.push(a);
    });
};
Object.keys(obj).length; // should be 3 because it looks like this 
/* obj === {"lol": "what", owo: "pfft", omg: function(){_.each(obj, function(a){arr.push(a);});}} */

මෙය වළක්වා ගැනීමට පියවර:

  1. ඔබට යතුරු ගණන ගණනය කිරීමට අවශ්‍ය වස්තුවක කාර්යයන් නොතබන්න

  2. ශ්‍රිත සඳහා වෙනම වස්තුවක් භාවිතා කරන්න හෝ නව වස්තුවක් සාදන්න (ඔබට භාවිතා කරන ගොනුවේ කාර්යයන් කීයක් තිබේදැයි ගණනය කිරීමට අවශ්‍ය නම් Object.keys(obj).length)

ඔව්, මම මගේ උදාහරණයේ දී nodejs වෙතින් _ හෝ අවධාරනය කරන මොඩියුලය භාවිතා කළෙමි

ප්‍රලේඛනය මෙතැනින් සොයාගත හැකිය http://underscorejs.org/ මෙන්ම එහි මූලාශ්‍රය ගිතබ් සහ වෙනත් තොරතුරු

අවසානයේ ලොඩාෂ් ක්‍රියාත්මක කිරීම https://lodash.com/docs#size

_.size(obj)


ඔබගේ අදහස් වලට ප්‍රතිචාර වශයෙන් Array(obj).length: එය ක්‍රියා නොකරයි. http://jsfiddle.net/Jhy8M/
ජේමි චොං

ඔව්, මම තව ටිකක් ඒ ගැන සොයා බැලුවෙමි, හැකි නම් මෙම පිළිතුර ඉවත් කිරීම හෝ සියල්ල එකට සංස්කරණය කිරීම
බෙල්ඩැන්ඩු

මෙය එක් කාර්යයක් සමඟ සම්බන්ධයක් ඇති බව මට නොපෙනේ, සහ ක්‍රෝම් හි මෙම හැසිරීම කිසිසේත් මා දකින්නේ නැත. මම මේ සැකසුම් හැසිරීම නැති නිසා විය හැක සැක කරන ගණ්ය: Object.defineProperty () වන falseමම තවම ආකාරය පිළිබඳ කිසිදු ප්රලේඛනය සොයාගත නොහැකි තියෙනවා නමුත්, var obj = { a: true, b: true }වෙනස් විය හැක var obj = {}; obj.a = true; obj.b = true;මේ W3 වෙනස් පරිවර්ථන / semantics තිබේ නම් හෝ සරලව ක්‍රෝම් විසින් සම්මත කරන ලදි.
නොලෝ

11

ඉහත පිළිතුරු දුන් පරිදි: Object.keys(obj).length

නමුත්: අපට දැන් ES6 හි සැබෑ සිතියම් පන්තියක් ඇති බැවින්, වස්තුවක ගුණාංග භාවිතා කිරීම වෙනුවට එය භාවිතා කිරීමට මම යෝජනා කරමි .

const map = new Map();
map.set("key", "value");
map.size; // THE fastest way

10

ක්‍රම තුනක් සඳහා කාර්ය සාධන පරීක්ෂණ කිහිපයක් මෙන්න;

https://jsperf.com/get-the-number-of-keys-in-an-object

Object.keys () දිග

තත්පරයට මෙහෙයුම් 20,735 කි

ඉතා සරල හා අනුකූල වේ. වේගවත් නමුත් මිල අධික ලෙස ධාවනය වන්නේ එය නව යතුරු මාලාවක් නිර්මාණය කරන නිසා එය ඉවතට විසිවන බැවිනි.

return Object.keys(objectToRead).length;

යතුරු හරහා ලූප

තත්පරයට මෙහෙයුම් 15,734 කි

let size=0;
for(let k in objectToRead) {
  size++
}
return size;

තරමක් මන්දගාමී, නමුත් මතක භාවිතය අසල කොතැනකවත් නැත, එබැවින් ඔබ ජංගම හෝ වෙනත් කුඩා යන්ත්‍ර සඳහා ප්‍රශස්තිකරණය කිරීමට කැමති නම් වඩා හොඳය

වස්තුව වෙනුවට සිතියම භාවිතා කිරීම

තත්පරයට මෙහෙයුම් 953,839,338 කි

return mapToRead.size;

මූලික වශයෙන්, සිතියම එහි ප්‍රමාණය නිරීක්ෂණය කරන බැවින් අපි සංඛ්‍යා ක්ෂේත්‍රයක් නැවත ලබා දෙන්නෙමු. වෙනත් ක්‍රමයකට වඩා බොහෝ වේගවත් ය. ඔබට වස්තුව පාලනය කළ හැකි නම්, ඒ වෙනුවට ඒවා සිතියම් බවට පරිවර්තනය කරන්න.


8

ඔවුන්ගේ ව්‍යාපෘතියට Underscore.js ඇතුළත් කර ඇති අයට ඔබට කළ හැක්කේ:

_({a:'', b:''}).size() // => 2

හෝ ක්‍රියාකාරී විලාසය:

_.size({a:'', b:''}) // => 2

6

සිට: https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

Object.defineProperty (obj, prop, descriptor)

ඔබට එය ඔබගේ සියලු වස්තු වලට එකතු කළ හැකිය:

Object.defineProperty(Object.prototype, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

හෝ තනි වස්තුවක්:

var myObj = {};
Object.defineProperty(myObj, "length", {
    enumerable: false,
    get: function() {
        return Object.keys(this).length;
    }
});

උදාහරණයක්:

var myObj = {};
myObj.name  = "John Doe";
myObj.email = "leaked@example.com";
myObj.length; //output: 2

ඒ ආකාරයෙන් එකතු කළ විට, එය ලූප සඳහා පෙන්වනු නොලැබේ:

for(var i in myObj) {
     console.log(i + ":" + myObj[i]);
}

ප්‍රතිදානය:

name:John Doe
email:leaked@example.com

සටහන: එය <IE9 බ්‍රව්සර් තුළ ක්‍රියා නොකරයි.


ඔබ ගොඩනඟන ලද මූලාකෘති දීර් extend කිරීමට හෝ දේපලක් (එනම් වඳුරු-පැච්) බහුකාර්ය කිරීමට යන්නේ නම්, කරුණාකර එය නිවැරදිව කරන්න: ඉදිරි අනුකූලතාව සඳහා, දේපල පළමුව තිබේදැයි පරීක්ෂා කරන්න, ඉන්පසු දේපල ගණන් කළ නොහැකි ලෙස සකසන්න, එවිට තමන්ගේම යතුරු ඉදිකරන ලද වස්තූන් දූෂණය නොවේ. ක්රම භාවිතා සඳහා සැබෑ ක්රම . මගේ නිර්දේශය: සාදන ලද ක්‍රම මෙන් හැකිතාක් සමීපව හැසිරෙන ක්‍රමයක් එකතු කරන්නේ කෙසේද යන්න පෙන්වන මෙම උදාහරණ අනුගමනය කරන්න .
user4642212

5

මම මෙම ගැටළුව විසඳූ ආකාරය නම්, වස්තුව තුළ කොපමණ අයිතම ප්‍රමාණයක් ගබඩා වී ඇත්ද යන්න පිළිබඳ වාර්තාවක් තබා ගන්නා මූලික ලැයිස්තුවක් මා විසින්ම ක්‍රියාත්මක කිරීමයි. එය ඉතා සරල ය. මේ වගේ දෙයක්:

function BasicList()
{
   var items = {};
   this.count = 0;

   this.add = function(index, item)
   {
      items[index] = item;
      this.count++;
   }

   this.remove = function (index)
   {
      delete items[index];
      this.count--;
   }

   this.get = function(index)
   {
      if (undefined === index)
        return items;
      else
        return items[index];
   }
}

1
සිත්ගන්නා විකල්පය. මෙය සමස්ත ගණන් කිරීමේ ශ්‍රිතයක පොදු කාර්යය ඉවත් කරයි, නමුත් ශ්‍රිතයක පිරිවැය අනුව ඔබ මූලද්‍රව්‍යයක් එකතු කරන විට හෝ ඉවත් කරන සෑම අවස්ථාවකම එය අවාසනාවකට වඩා නරක විය හැකිය. සරල පෙළක් හා සසඳන විට දත්ත සංයුක්ත කිරීම සහ එය ලබා දිය හැකි අභිරුචි ක්‍රම සඳහා මම පුද්ගලිකව එවැනි ලැයිස්තු ක්‍රියාත්මක කිරීමක් භාවිතා කරමි, නමුත් මට වේගවත් අයිතම ගණනය කිරීම අවශ්‍ය වූ විට නොවේ.
ලූක් 125

1
මම ඔබේ පිළිතුරට කැමතියි, නමුත් මම ද දෙහි ගෙඩියක් වන අතර ඉහළට ක්ලික් කළෙමි. මෙය සිත්ගන්නා උභතෝකෝටිකයක් ඉදිරිපත් කරයි. මම දැනටමත් ඔබේ පිළිතුර ඉහළ නංවා ඇති මගේ තත්වය වැනි ඔබේ උපදෙස් වල යම් හැසිරීමක් ගැන ඔබ ගණන් නොගනී, නමුත් පසුව මට උපදෙස් දී ඇත්තේ "ඉහළට ක්ලික් කරන්න" සහ නොහැකි ය. උපදෙස් නිහ ly ව අසමත් වන නමුත් නිහ ly ව අසමත් වීම ඔබේ කේතය කිරීමට ඔබ කැමති දෙයක් නොවන බව SO හි ඔබගේ අන්තර්ගතයෙන් මම රැස් කරමි. හිස ඔසවන්න.
L0j1k

1
මම ඇත්තටම මේ පිළිතුරට කැමතියි, ලස්සන දත්ත ව්‍යුහයක්. එකතු කිරීමේ ශ්‍රිත ඇමතුම් සමඟ කාර්ය සාධන බලපෑමක් තිබුනේ නම්, වස්තුවක් හරහා නැවත යෙදීමට සිදුවුවහොත් ඊටත් වඩා විශාල කාර්ය සාධනයක් ලැබෙනු ඇත. මෙය වේගවත්ම ලූප පැටන් සඳහා ඉඩ දිය යුතුයvar i = basiclist.count while(i--){...}
Lex

මූලික ලැයිස්තුවකට අවම වශයෙන් මූලික චෙක්පත් ඇතුළත් කළ යුතු නොවේද? addපරණ අයිතමයක් ප්‍රතිස්ථාපනය කරන්නේද නැතිනම් removeනොපවතින දර්ශකයක් සමඟ කැඳවනු ඇත්දැයි පරීක්ෂා කිරීම වැනි . undefinedවලංගු අයිතම අගයක් නම් ලැයිස්තුවේ දී ඇති දර්ශකයක් තිබේදැයි පරීක්ෂා කළ නොහැක .
රොබට්

2
ලැයිස්තුවක් ඇණවුම් කළ යුතු අතර එය කළ හැකි ය. දත්ත වස්තුවක ගබඩා කර ඇති බැවින් මූලද්‍රව්‍ය අනුපිළිවෙලට සහතිකයක් නොමැත. සිදුරු සහිත ලැයිස්තුවක් දිග සොයා ගන්නේ කෙසේද? this.count? ඉහළම දර්ශක අගය? ඔබ කවදා හෝ එකම දර්ශකයට අයිතම දෙකක් එකතු කළහොත් ගණනය දෝෂ තත්වයකට පත්වේ.
අවසාන ගොබ්බය

4

Object.keys(data).lengthයතුරු දත්ත ඇති JSON වස්තුවේ දිග සොයා ගැනීමට ඔබට භාවිතා කළ හැකිය


3

ඔවුන්ගේ ව්‍යාපෘතියේ Ext JS 4 ඇති අයට ඔබට කළ හැක්කේ:

Ext.Object.getSize(myobj);

මෙහි ඇති වාසිය නම්, එය සියලු අමතර අනුකූල බ්‍රව්සර් (IE6-IE8 ඇතුළත්) මත ක්‍රියා කරනු ඇත, කෙසේ වෙතත්, වෙනත් යෝජිත විසඳුම් මෙන්, ධාවන කාලය O (n) ට වඩා හොඳ නොවන බව මම විශ්වාස කරමි.


2

ඔයාට පාවිච්චි කරන්න පුළුවන්:

Object.keys(objectName).length; 

සහ

Object.values(objectName).length;

1

වස්තුව නෝඩ්ලිස්ට් එකක් දැයි OP නිශ්චිතව දක්වා නැත, එසේ නම් ඔබට එය මත දිග ක්‍රමය කෙලින්ම භාවිතා කළ හැකිය . උදාහරණයක්:

buttons = document.querySelectorAll('[id=button)) {
console.log('Found ' + buttons.length + ' on the screen'); 

0

ඉහත jQuery ක්‍රියා නොකරන්නේ නම් උත්සාහ කරන්න

$(Object.Item).length

3
එය Object.Itemනොපවතින බව පෙනේ
Luc125

-1

මම මේ වගේ සියලුම වස්තු සඳහා එය ලබා දීමට උත්සාහ කරමි:

Object.defineProperty(Object.prototype, "length", {
get() {
    if (!Object.keys) {
        Object.keys = function (obj) {
            var keys = [],k;
            for (k in obj) {
                if (Object.prototype.hasOwnProperty.call(obj, k)) {
                    keys.push(k);
                }
            }
            return keys;
        };
    }
    return Object.keys(this).length;
},});

console.log({"Name":"Joe","Age":26}.length) //returns 2

-2

මෙය කළ හැකි යැයි මම නොසිතමි (අවම වශයෙන් සමහර අභ්‍යන්තර භාවිතා නොකර). මෙය ප්‍රශස්ත කිරීමෙන් ඔබට බොහෝ වාසි ලැබෙනු ඇතැයි මම නොසිතමි.


2
පිළිගත් පිළිතුරෙන් මෙය කළ හැකි බව පෙන්වන අතර, ලබා ගැනීමට කිසිවක් නොමැති බව ප්‍රකාශ කිරීමට ඔබට සන්දර්භයක් නොමැත.
කොන්ඩියුට්

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.