ජාවාස්ක්‍රිප්ට් වස්තුවක දිග


2390

මට ජාවාස්ක්‍රිප්ට් වස්තුවක් තිබේ, මෙම වස්තුවේ දිග ලබා ගැනීම සඳහා ගොඩනංවන ලද හෝ පිළිගත් හොඳම පුහුණු ක්‍රමයක් තිබේද?

const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

15
ජාවාස්ක්රිප්ට් ඇති වස්තුවක් literals පෙරනිමි associative පෙලගැස්මක් උදා object.propertyName.propertyValue විසින් වේ [propertyName] [propertyValue] වස්තුව හා සමාන වේ
neitony

6
මෙය සිදු කරන Underscore.js හි එක් ලයිනර් එකක් එක් කරන ලදි: stackoverflow.com/a/11346637/11236
ripper234

31
පේළියේ පිළිතුර වූ පසු Object.keys (myArray) භාවිතා කරන්න .අයොසින්ත් පැවසූ පරිදි දිග.
රණදීර් රෙඩ්ඩි

67
හරි, කොහොමදObject.keys(obj).length
මුහම්මද් උමර්

5
Object.length වලංගු නොවන්නේ ඇයි? එය මට නිවැරදි ප්‍රති result ලය ලබා දෙයි.
ඒඩ්‍රියන් එම්

Answers:


2629

වඩාත්ම ශක්තිමත් පිළිතුර (එනම් අඩුම දෝෂ ඇති කරන අතරතුර ඔබ කිරීමට උත්සාහ කරන දෙයෙහි අභිප්‍රාය ග්‍රහණය කරගනී):

Object.size = function(obj) {
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

// Get the size of an object
var size = Object.size(myObj);

ජාවාස්ක්‍රිප්ට් හි යම් ආකාරයක සම්මුතියක් ඇත, ඔබ Object.prototype වෙත දේවල් එකතු නොකරයි , එයට විවිධ පුස්තකාලවල ගණන් කිරීම් බිඳ දැමිය හැකිය. වස්තුවට ක්‍රම එකතු කිරීම සාමාන්‍යයෙන් ආරක්ෂිතයි.


මෙන්න 2016 වන විට යාවත්කාලීන කිරීමක් සහ ES5 සහ ඉන් ඔබ්බට පුළුල් ලෙස යෙදවීම . IE9 + සහ අනෙකුත් සියලුම නවීන ES5 + හැකියාව ඇති බ්‍රව්සර් සඳහා, ඔබට භාවිතා කළ හැකි Object.keys()බැවින් ඉහත කේතය පහත පරිදි වේ:

var size = Object.keys(myObj).length;

මෙය Object.keys()දැනට ගොඩනගා ඇති බැවින් දැනට පවතින කිසිදු මූලාකෘතියක් වෙනස් කිරීමට අවශ්‍ය නොවේ .

සංස්කරණය කරන්න : වස්තු වලට සංකේතාත්මක ගුණාංග තිබිය හැකි අතර ඒවා Object.key ක්‍රමය හරහා ආපසු ලබා දිය නොහැක. එබැවින් ඒවා සඳහන් නොකර පිළිතුර අසම්පූර්ණ වනු ඇත.

වස්තු ගුණාංග සඳහා අද්විතීය හඳුනාගැනීම් නිර්මාණය කිරීම සඳහා භාෂාවට සංකේත වර්ගය එක් කරන ලදි. සංකේත වර්ගයේ ප්‍රධාන වාසිය වන්නේ නැවත ලිවීම වැළැක්වීමයි.

Object.keysහෝ Object.getOwnPropertyNamesසංකේතාත්මක ගුණාංග සඳහා ක්‍රියා නොකරයි. ඒවා ආපසු ලබා දීමට ඔබ භාවිතා කළ Object.getOwnPropertySymbolsයුතුය.

var person = {
  [Symbol('name')]: 'John Doe',
  [Symbol('age')]: 33,
  "occupation": "Programmer"
};

const propOwn = Object.getOwnPropertyNames(person);
console.log(propOwn.length); // 1

let propSymb = Object.getOwnPropertySymbols(person);
console.log(propSymb.length); // 2

65
@Tres - ඔබ දැනටමත් කේතයේ කොතැනක හෝ ප්‍රකාශ කර ඇති බව නොදැන යමෙකු පැමිණ 'ප්‍රමාණයේ' දේපල ඉක්මවා ගියහොත් ඔබේ කේතය බිඳ දැමිය හැකිය, එබැවින් එය දැනටමත් අර්ථ දක්වා ඇත්දැයි පරීක්ෂා කිරීම වටී
vsync

19
svsync ඔබ හරි. යමෙක් සෑම විටම අවශ්‍ය සනීපාරක්ෂක චෙක්පත් ක්‍රියාත්මක කළ යුතුය :)
Tres

134
හැමෝම මෙය නොසලකා Object.keys(obj).length
මුහම්මද් උමර්

34
Um මුහම්මද් උමර් මෙම පිළිතුර ලිවීමේදී පවා එම ක්‍රමය නොතිබූ නිසා විය හැකිය. අද පවා, එය භාවිතා කිරීම බොහෝ විට පැරණි බ්‍රව්සර් සඳහා පොලිෆිල් එකක් අවශ්‍ය වනු ඇත.
ක්‍රිස් හේස්

21
onystonyau IE8, IE9, IE10 යනු මයික්‍රොසොෆ්ට් වෙතින් සහය නොලැබෙන මියගිය බ්‍රව්සර් ය. IE8, IE9, IE10 පරිශීලකයාට මයික්‍රොසොෆ්ට් වෙතින් දැනුම් දීමක් ලැබෙනු ඇත, ඔවුන් පැරණි, සහාය නොදක්වන බ්‍රව්සරයක් භාවිතා කරන බවත්, ඔවුන් සඳහා දේවල් ක්‍රියාත්මක නොවනු ඇතැයි අපේක්ෂා කළ යුතු බවත්. support.microsoft.com/en-us/kb/3123303
ලූකස් Liesis

1713

hasOwnPropertyචෙක්පත් ගැන කරදර විය යුතු නැති බව ඔබ දන්නේ නම් , ඔබට මෙය ඉතා සරලව කළ හැකිය:

Object.keys(myArray).length

23
ඇයි නැත්තේ? : මම දන්නා දේ සිට, එය සම්මත වේ developer.mozilla.org/en/JavaScript/Reference/Global_Objects/...
VSYNC

104
එය විශ්වීයව ක්‍රියාත්මක කරන ක්‍රමයක් නොවේ, නමුත් මෙම වගුව සමඟ කුමන බ්‍රව්සරය එයට සහය දක්වයිදැයි ඔබට පරීක්ෂා කළ හැකිය .
aeosynth

51
IE8 සහාය නැත = යන්න එපා.
ripper234

22
firefox වෙත මාරුවීමට කාලය = අවාසනාවකට මෙන්, ඔබ මාරුවීමෙන් අදහස් කරන්නේ ඔබේ වෙබ් අඩවියේ පරිශීලකයින් කැමති වනු ඇති බවයි ...
mdup

82
@ ripper234 නැත IE support = පොලිෆිල් කිරීමට කාලය
ජෝන්

287

යාවත්කාලීන කරන ලද්දේ : ඔබ Underscore.js භාවිතා කරන්නේ නම් (නිර්දේශිතයි, එය සැහැල්ලුයි!), එවිට ඔබට කළ හැකිය

_.size({one : 1, two : 2, three : 3});
=> 3

එසේ නොවේ නම් , සහ ඔබට කිසියම් හේතුවක් නිසා වස්තු ගුණාංග සමඟ පටලවා ගැනීමට අවශ්‍ය නැති අතර දැනටමත් jQuery භාවිතා කරමින් සිටී නම්, ප්ලගිනයක් සමානව ප්‍රවේශ විය හැකිය:

$.assocArraySize = function(obj) {
    // http://stackoverflow.com/a/6700/11236
    var size = 0, key;
    for (key in obj) {
        if (obj.hasOwnProperty(key)) size++;
    }
    return size;
};

7
_.size()underscore.js සහය ඇති මගේ උල්කාපාත ව්‍යාපෘතිය සඳහා කදිම විසඳුම විය .
tokyovariable

4
මම අවධාරනය කරන අතර මෙම සටහන මට මතක් කර දුන්නේ මම මෙම ව්‍යාපෘතියේ එය ප්‍රමාණවත් ලෙස භාවිතා නොකරන බවයි. ඔබ වස්තූන් හසුරුවන්නේ නම්, ඔබට underscore.js තිබිය යුතුය.
jbolanos

3
අන්ඩර්ස්කෝර්> (සියල්ල - ['ලො-ඩෑෂ්'])
රේජැක්ස්

underscorejs, js යටතේ තිබිය යුතු දේවල් :)
minhajul

1
- උරුම වූ ඒවාට එදිරිව වස්තුවේ සැබෑ ගුණාංග වෙන්කර හඳුනා ගැනීම සඳහා බේබීඩ්. developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
ripper234

56

මෙන්න වඩාත්ම හරස් බ්රවුසර විසඳුම.

මෙය පිළිගත් පිළිතුරට වඩා හොඳය, මන්ද එය පවතින්නේ නම් ස්වදේශීය Object.keys භාවිතා කරයි. මේ අනුව, එය සියලු නවීන බ්‍රව්සර් සඳහා වේගවත්ම වේ.

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

Object.keys(obj).length;

6
Object.keys()ගණන් කළ හැකි ගුණාංගවල නම් පමණක් අඩංගු අරාවක් ලබා දෙයි. ඔබට සියලු ගුණාංග සහිත අරාවක් අවශ්‍ය නම්, Object.getOwnPropertyNames()ඒ වෙනුවට ඔබ භාවිතා කළ යුතුය . ශුද්ධාසනයේ developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
ජෝන් Slegers

35

මම ජාවාස්ක්‍රිප්ට් විශේෂ expert යෙක් නොවෙමි, නමුත් ඔබට පෙනෙන්නේ මූලද්‍රව්‍යයන් හරහා ඒවා ගණනය කර වස්තුවට දිග ක්‍රමයක් නොමැති බැවින් ඒවා ගණන් කළ යුතු බවයි:

var element_count = 0;
for (e in myArray) {  if (myArray.hasOwnProperty(e)) element_count++; }

alpalmsey: OP ට සාධාරණයක් ලෙස, ජාවාස්ක්‍රිප්ට් ප්‍රලේඛනය ඇත්ත වශයෙන්ම පැහැදිලිවම සඳහන් කරන්නේ මේ ආකාරයෙන් වස්තු වර්ගයේ විචල්‍යයන් “සහායක අරා” ලෙස භාවිතා කිරීමයි.


8
ක්‍රියා නොකරනු ඇත, මන්ද එය මූලාකෘති හරහා එකතු කරන ක්‍රම ද ගණනය කරනු ඇත.
ලාජෝස් මෙසාරොස්

30

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

Object.getOwnPropertyNames({"hi":"Hi","msg":"Message"}).length; // => 2

1
At පැට්‍රික් රොබට්ස් යතුරු ක්‍රමය මඟින් මූලාකෘති දාමයෙන් ගුණාංග ලබා නොදේ. ඉතින් ඇයි hasOwnProperty හි අවශ්‍යතාවය. දිග අරාවෙහි ඇති බැවින් getOwnProperty විසින් සැඟවුණු දේපල නැවත ලබා දෙනු ඇත
මුහම්මද් උමර්

24

මූලාකෘති හෝ වෙනත් කේත සමඟ පටලවා නොගැනීමට, ඔබට ඔබේම වස්තුවක් සාදා දිගු කළ හැකිය:

function Hash(){
    var length=0;
    this.add = function(key, val){
         if(this[key] == undefined)
         {
           length++;
         }
         this[key]=val;
    }; 
    this.length = function(){
        return length;
    };
}

myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2

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

ඇත්ත වශයෙන්ම, ඔබට සෑම විටම ක්රම නැවත ලිවිය හැකිය. නමුත් ඔබ එසේ කළත්, ඔබේ කේතය සැලකිය යුතු ලෙස අසමත් වන අතර එය නිදොස් කිරීම පහසු කරයි. ;)


අරාව විශාල නම් මිල අධික විය හැකි 'for' සමඟ ලූපයක් අවශ්‍ය නොවන බැවින් මෙය හොඳම විසඳුම යැයි මම සිතමි
Emeka Mbah

20

දේපල මූලාකෘති දාමයේ නොමැති බව පරීක්ෂා කිරීමට මෙන්න සහ අමතක නොකරන්න:

var element_count = 0;
for(var e in myArray)
    if(myArray.hasOwnProperty(e))
        element_count++;

20

මෙය ලබා ගැනීමට මෙය භාවිතා කරන්න length:

Object.keys(myObject).length

7
කරුණාකර ඔබේ පිළිතුර stackoverflow.com/a/6700/8632727 ට
පටටා

3
ඔබත් ඇත්ත වශයෙන්ම ඔබේ වස්තුව නම් නොකළ යුතුයmyArray
බැරී මයිකල් ඩොයිල්

2
Ar බැරී මයිකල් ඩොයිල් මම එය වෙනස් කර
ඇත්තෙමි

1
හොඳයි, ඔබේ විචල්‍යයන් ඇත්ත වශයෙන්ම ඒවාට අනුව නම් කිරීම සැමවිටම හොඳය. ඔබගේ කේතය වෙනත් ඩිව්ස් වලට වඩා කියවිය හැකි කරයි.
බැරී මයිකල් ඩොයිල්

4
"MyArray" -> "myObject" සංස්කරණයට පෙර, මෙය දෙවන ඉහළම ඉහළම පිළිතුරට සමාන විය.
යුනොෂ්

17

<script>
myObj = {"key1" : "Hello", "key2" : "Goodbye"};
var size = Object.keys(myObj).length;
console.log(size);
</script>

<p id="myObj">The number of <b>keys</b> in <b>myObj</b> are: <script>document.write(size)</script></p>

මෙය මට වැඩ කරයි:

var size = Object.keys(myObj).length;

16

මෙන්න සම්පූර්ණයෙන්ම වෙනස් විසඳුමක් වන අතර එය වඩාත් නවීන බ්‍රව්සර්වල පමණක් ක්‍රියා කරයි (IE9 +, ක්‍රෝම්, ෆයර්ෆොක්ස් 4+, ඔපෙරා 11.60+, සෆාරි 5.1+)

JsFiddle බලන්න

ඔබේ ඇසෝසියේටිව් අරා පන්තිය සකසන්න

/**
 * @constructor
 */
AssociativeArray = function () {};

// Make the length property work
Object.defineProperty(AssociativeArray.prototype, "length", {
    get: function () {
        var count = 0;
        for (var key in this) {
            if (this.hasOwnProperty(key))
                count++;
        }
        return count;
    }
});

දැන් ඔබට මෙම කේතය පහත පරිදි භාවිතා කළ හැකිය ...

var a1 = new AssociativeArray();
a1["prop1"] = "test";
a1["prop2"] = 1234;
a1["prop3"] = "something else";
alert("Length of array is " + a1.length);

මම හිතන්නේ එය ආරක්ෂිත නොවේ. උදාහරණයක් ලෙස එයට "දිග" යතුරක් සහිත මූලද්‍රව්‍යයක් තිබිය නොහැක, ප්‍රකාශය a1 ["දිග"] = "හෙලෝ වර්ල්ඩ්"; ප්‍රවේශය ගබඩා කිරීමට අපොහොසත් වේ. A1 ["hasOwnProperty"] = "යම් මුක්කු"; සම්පුර්ණ ශ්‍රිතය බිඳ දමයි
Panos Theof

3
AnPanosTheof ඔබ lengthදේපල භාවිතා කළේ නම් එහි වටිනාකම ගබඩා කර තැබීමට ඔබට අවශ්‍ය යැයි මම නොසිතමි, එය භාවිතා කළ ඕනෑම කේතයක් එය උත්සාහ කර ගබඩා නොකිරීමට වග බලා ගත යුතුය length, නමුත් එය එසේ නම් එය එසේම වනු ඇත සම්මත අරාවක් ද ඇත. ආධිපත්යධාරී hasOwnPropertyඕනෑම වස්තුවක් මත බොහෝ දුරට ඉඩ ක අකැමති නිසා නිෂ්පාදනය ඇත.
අලි

15

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



14

alm පැල්ම්සි: OP ට සාධාරණයක් ලෙස, ජාවාස්ක්‍රිප්ට් ලියකියවිලි ඇත්ත වශයෙන්ම පැහැදිලිවම සඳහන් කරන්නේ වස්තු වර්ගයේ විචල්‍යයන් මේ ආකාරයෙන් “සහායක අරා” ලෙස භාවිතා කිරීමයි.

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

ජාවාස්ක්‍රිප්ට් “ඇසෝසියේටිව් අරා” හානිකර ලෙස සැලකේ

නමුත් මේ සියල්ලට අනුව, පිළිගත් පිළිතුර නරක පුරුද්දක් නොවේද?

වස්තුව සඳහා මූලාකෘති ප්‍රමාණයේ () ශ්‍රිතයක් සඳහන් කරන්න

Object .prototype වෙත වෙනත් යමක් එකතු කර ඇත්නම්, එවිට යෝජිත කේතය අසාර්ථක වනු ඇත:

<script type="text/javascript">
Object.prototype.size = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
Object.prototype.size2 = function () {
  var len = this.length ? --this.length : -1;
    for (var k in this)
      len++;
  return len;
}
var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
alert("age is " + myArray["age"]);
alert("length is " + myArray.size());
</script>

එකම ක්‍රියාත්මක කිරීමේ සන්දර්භය තුළ ඔබට වෙනත් කේතයක් තිබේ නම් එය ක්‍රියාත්මක කිරීම විශ්වාස කළ නොහැකි බැවින් එම පිළිතුර පිළිගත් පිළිතුර විය යුතු යැයි මම නොසිතමි. එය ශක්තිමත් ආකාරයකින් සිදු කිරීම සඳහා නියත වශයෙන්ම ඔබට myArray තුළ ඇති ප්‍රමාණයේ ක්‍රමය නිර්වචනය කළ යුතු අතර ඔබ ඔවුන් හරහා ගමන් කරන විට සාමාජිකයින්ගේ වර්ගය පරීක්ෂා කරන්න.


13

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

const myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3

11

මේ වගේ දෙයක් ගැන -

function keyValuePairs() {
    this.length = 0;
    function add(key, value) { this[key] = value; this.length++; }
    function remove(key) { if (this.hasOwnProperty(key)) { delete this[key]; this.length--; }}
}

11

අපට හැෂ් තිබේ නම්

hash = {"a": "b", "c": "d"};

හෑෂ් වල දිග වන යතුරු වල දිග භාවිතා කර අපට දිග ලබා ගත හැකිය:

යතුරු (හැෂ්). දිග


2
මෙය හොඳ පිළිතුරකි, කෙසේ වෙතත් මට මෙම යතුරු ක්‍රියාකාරිත්වය සඳහා කිසිදු ලේඛනයක් සොයාගත නොහැක. එබැවින් හරස් බ්‍රව්සර් සහාය ගැන මට විශ්වාස කළ නොහැක.
චිම්

1
අවාසනාවට, මෙය මා මුලින් සිතූ තරම් හොඳ පිළිතුරක් නොවේ! යතුරු ක්‍රියාකාරිත්වය ලබා ගත හැක්කේ ක්‍රෝම් සහ ෆයර්ෆොක්ස් වෙබ් කොන්සෝලවල පමණක් බව පෙනේ. ඔබ මෙම කේතය ස්ක්‍රිප්ටයකට දැමුවහොත් එය Uncaught ReferenceError සමඟ අසමත් වනු ඇත: යතුරු අර්ථ දක්වා නැත
chim


1
මෙය aeosynth ගේ පිළිතුරට වඩා වෙනස් වන්නේ කෙසේද ?
පීටර් මෝර්ටෙන්සන්

11
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values ​​(myObject). දිග
  2. Object.entries (myObject). දිග
  3. Object.keys (myObject). දිග

1
ඉහත 3 අතරින් වඩා වේගවත් වන්නේ කුමක්ද
සිලුවෙරු කිරාන් කුමාර්

1
Object.values ​​(myObject) .length
tdjprog

1
එය අපි කොහොමද කියන්න පුළුවන් Object.values (myObject) .length වේගවත් වේ ස්තූතියි, @tdjprog ඕනෑම උදාහරණයක් තිබෙනවා
siluveru කිරාන් කුමාර්

1
මෙය කොන්සෝලය තුළ උත්සාහ කරන්න:var myObject = {}; for (let i=0; i<10000000; i++) myObject[i] = i;
tdjprog

1
ඇයි Object.values (myObject) .length වේගවත්, එහිදී ලෙස Object.entries (myObject) .length පවා යම් කලකට පසු ප්රතිදාන ලබා මෙතන හේතුව කුමක්ද නැහැ? ස්තූතියි dtdjprog
siluveru kiran kumar

11

සරලම ක්‍රමය මේ වගේ ය

Object.keys(myobject).length

එහිදී myobject යනු ඔබට අවශ්‍ය දිග ප්‍රමාණයයි


3
මෙය දැනට පවතින මෙම පිළිතුරේ පුනරාවර්තනයක් ලෙස පෙනේ .
පැං

Ang පැන්ග් එකඟ වූ අතර, එය වෙනත් පිළිතුරු මෙන් තවත් සන්දර්භයක් සපයන්නේ නැත.
අද්භූත

10

ඔබ AngularJS 1.x භාවිතා කරන්නේ නම්, ඔබට පෙරනයක් නිර්මාණය කිරීමෙන් සහ පහත දැක්වෙන වෙනත් උදාහරණ වලින් කේතය භාවිතා කිරීමෙන් AngularJS ක්‍රමයට දේවල් කළ හැකිය:

// Count the elements in an object
app.filter('lengthOfObject', function() {
  return function( obj ) {
    var size = 0, key;
    for (key in obj) {
      if (obj.hasOwnProperty(key)) size++;
    }
   return size;
 }
})

භාවිතය

ඔබේ පාලකය තුළ:

$scope.filterResult = $filter('lengthOfObject')($scope.object)

හෝ ඔබේ මතය අනුව:

<any ng-expression="object | lengthOfObject"></any>

4
OP විසින් AngularJS අනුවාදයක් ඉල්ලා නොමැත. මෙය ප්‍රශ්නයට වලංගු පිළිතුරක් නොවේ.
ෆ්‍රැන්සිස්කෝ හොජ්

10
const myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length)

// o/p 3

9

Object.keys(myObject).lengthවස්තුව / අරාවෙහි දිග ලබා ගැනීමට භාවිතා කරන්න

var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;

console.log(Object.keys(myObject).length); //3

8

ඉන්ටර්නෙට් එක්ස්ප්ලෝරර් 8 හෝ ඊට අඩු සහය දැක්වීම ගැන ඔබ තැකීමක් නොකරන්නේ නම්, පහත දැක්වෙන පියවර දෙක අනුගමනය කිරීමෙන් ඔබට පහසුවෙන් වස්තුවක ඇති දේපල ගණන ලබා ගත හැකිය:

  1. ධාවනය හෝ Object.keys()සිටින බව එම ගුණ පමණක් නම් අඩංගු වන බව මාලාවක් ලබා ගැනීමට ගණ්ය හෝ Object.getOwnPropertyNames()ඔබ ද ගණ්ය නොවන බව ගුණ නම් ඇතුළත් කිරීමට අවශ්ය නම්.
  2. .lengthඑම අරාවෙහි දේපල ලබා ගන්න .

ඔබට මෙය එක් වරකට වඩා කිරීමට අවශ්‍ය නම්, ඔබට මෙම තර්කනය ශ්‍රිතයක් තුළට ඔතා ගත හැකිය:

function size(obj, enumerablesOnly) {
    return enumerablesOnly === false ?
        Object.getOwnPropertyNames(obj).length :
        Object.keys(obj).length;
}

මෙම විශේෂිත ශ්‍රිතය භාවිතා කරන්නේ කෙසේද:

var myObj = Object.create({}, {
    getFoo: {},
    setFoo: {}
});
myObj.Foo = 12;

var myArr = [1,2,5,4,8,15];

console.log(size(myObj));        // Output : 1
console.log(size(myObj, true));  // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr));        // Output : 6
console.log(size(myArr, true));  // Output : 6
console.log(size(myArr, false)); // Output : 7

නිරූපණයක් සඳහා මෙම ෆෙඩෙල් ද බලන්න .


7

ඉහත සමහරක් මත විචලනය වන්නේ:

var objLength = function(obj){    
    var key,len=0;
    for(key in obj){
        len += Number( obj.hasOwnProperty(key) );
    }
    return len;
};

HasOwnProp ඒකාබද්ධ කිරීම සඳහා එය තව ටිකක් අලංකාර ක්‍රමයකි.


6

ජේම්ස් කොගන්ගේ පිළිතුරේ වෙනස් අනුවාදයක් මෙන්න. තර්කයක් සම්මත කරනවා වෙනුවට, වස්තු පන්තිය මූලාකෘති කොට කේතය පිරිසිදු කරන්න.

Object.prototype.size = function () {
    var size = 0,
        key;
    for (key in this) {
        if (this.hasOwnProperty(key)) size++;
    }
    return size;
};

var x = {
    one: 1,
    two: 2,
    three: 3
};

x.size() === 3;

jsfiddle උදාහරණය: http://jsfiddle.net/qar4j/1/


6
Object.prototype- නරක අදහස.
ඩියාඩ් බෝරෝවි

btborychowski කරුණාකර ඔබට පැහැදිලි කළ හැකිද?
මොහමඩ්

මෙන්න එක් ලිපියක්: bit.ly/1droWrG . එය සිදු නොකළ යුතු යැයි මම නොකියමි, ඔබ මෙය කිරීමට පෙර සියලු ප්‍රතිවිපාක දැන සිටිය යුතුය.
Dziad Borowy

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

5

Object.keys(obj).lengthඕනෑම වස්තුවක දිග ලබා ගැනීම සඳහා ඔබට එය භාවිතා කළ හැකිය . Object.keys විසින් අනුරූපී අරාවෙහි දිග භාවිතා කරමින් එම වස්තුවේ දිග සොයා ගැනීම සඳහා ප්‍රයෝජනවත් විය හැකි සියලුම වස්තු යතුරු (ගුණාංග) අඩංගු අරාවක් ලබා දෙයි. ඔබට මේ සඳහා ශ්‍රිතයක් පවා ලිවිය හැකිය . අපි නිර්මාණශීලී වී ඒ සඳහා ක්‍රමවේදයක් ලියමු (වඩාත් සුවපහසු දේපළක් සමඟ):

function objLength(obj)
{
  return Object.keys(obj).length;
}

console.log(objLength({a:1, b:"summit", c:"nonsense"}));

// Works perfectly fine
var obj = new Object();
obj['fish'] = 30;
obj['nullified content'] = null;
console.log(objLength(obj));

// It also works your way, which is creating it using the Object constructor
Object.prototype.getLength = function() {
   return Object.keys(this).length;
}
console.log(obj.getLength());

// You can also write it as a method, which is more efficient as done so above

Object.defineProperty(Object.prototype, "length", {get:function(){
    return Object.keys(this).length;
}});
console.log(obj.length);

// probably the most effictive approach is done so and demonstrated above which sets a getter property called "length" for objects which returns the equivalent value of getLength(this) or this.getLength()


4
මෙය aeosynth ගේ පිළිතුරට වඩා වෙනස් වන්නේ කෙසේද ?
පීටර් මෝර්ටෙන්සන්

එයට හේතුව එය ශ්‍රිතයක් සහ ගෝලීය වස්තු ක්‍රමයක් ලෙස ක්‍රියා කරන්නේ කෙසේද යන්න පෙන්වන බැවිනි (වඩා වස්තු නැඹුරු සහ යම් ආකාරයක සංවර්‍ධනයක් භාවිතා කරයි); කෙසේ වෙතත් aeosynth ගේ පිළිතුර නැත.
අද්භූත

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

එසේම, ක්‍රමයක් ලිවීම “වඩා කාර්යක්ෂම” වන්නේ කෙසේද?
user4642212

5

සාමාන්‍ය අරාව සඳහා ලබා දෙන ප්‍රති Object.getOwnPropertyNames(myObject).lengthresult ලය ලබා ගැනීමට ඔබට සැමවිටම කළ හැකිය [].length.


1
Object.keys()ගණන් කළ හැකි ගුණාංගවල නම් පමණක් අඩංගු අරාවක් ලබා දෙයි. ඔබට සියලු ගුණාංග සහිත අරාවක් අවශ්‍ය නම්, Object.getOwnPropertyNames()ඒ වෙනුවට ඔබ භාවිතා කළ යුතුය . ශුද්ධාසනයේ developer.mozilla.org/en/docs/Web/JavaScript/Reference/...
ජෝන් Slegers

3
මෙය aeosynth ගේ පිළිතුරට වඩා වෙනස් වන්නේ කෙසේද ?
පීටර් මෝර්ටෙන්සන්

4

භාවිතා කිරීමෙන් අපට වස්තුවේ දිග සොයාගත හැකිය:

Object.values(myObject).length

4

ක්‍රීඩාවට ටිකක් ප්‍රමාදයි, නමුත් මෙය සාක්ෂාත් කර ගැනීම සඳහා හොඳ ක්‍රමයක් (IE9 + පමණි) යනු දිග දේපල මත මැජික් ලබා ගන්නෙකු නිර්වචනය කිරීමයි:

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

ඔබට එය එසේ භාවිතා කළ හැකිය:

var myObj = { 'key': 'value' };
myObj.length;

දෙන්නම් 1.


2
මූලාකෘති වෙනස් කිරීමට එරෙහි තර්ක පසෙකට දැමුවද, මට පෞද්ගලිකව කිසි විටෙකත් දෝෂයක් ඇති වී නැති අතර මට එය ජාවාස්ක්‍රිප්ට්හි ප්‍රබල කරුණකි.
මැක්‍රෝමන්

3

කෙලින්ම ජාවාස්ක්‍රිප්ට් අතහැර දමා ඇති අය සඳහා කෝපි ස්ක්‍රිප්ට් හි ජේම්ස් කොග්ලන් දුන් පිළිතුරේ පිටපතක් පහත දැක්වේ :)

Object.size = (obj) ->
  size = 0
  size++ for own key of obj
  size

1
ඔබට බොහෝ විට පැවසීමට අවශ්‍ය විය size++ for own key of obj( own keyකෝපි ස්ක්‍රිප්ට් හි සින්ටැක්ස් සීනි වීම). hasOwnPropertyවස්තුවෙන් එවැනි දේපලක් ඇති විට එය කැඩී යන බැවින් වස්තුවෙන් කෙලින්ම භාවිතා කිරීම භයානක ය.
කොන්රාඩ් බොරොව්ස්කි

2
OP විසින් කෝපි ස්ක්‍රිප්ට් අනුවාදයක් ඉල්ලා නොසිටි අතර එය ටැග් කර නැත. මෙය ප්‍රශ්නයට වලංගු පිළිතුරක් නොවේ.
ෆ්‍රැන්සිස්කෝ හොජ්
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.