javascript - समझ - प्रपत्र एचटीएमएल




जावास्क्रिप्ट ऑब्जेक्ट की लंबाई (20)

मेरे पास एक जावास्क्रिप्ट ऑब्जेक्ट है, क्या इस ऑब्जेक्ट की लंबाई प्राप्त करने के लिए एक अंतर्निहित या स्वीकृत सर्वोत्तम अभ्यास तरीका है?

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

@palmsey: ओपी के लिए निष्पक्षता में, जावास्क्रिप्ट डॉक्स वास्तव में स्पष्ट रूप से इस तरह के ऑब्जेक्ट के वेरिएबल्स का उपयोग "सहयोगी सरणियों" के रूप में करते हैं।

और @palmsey के लिए निष्पक्षता में वह काफी सही था, वे साहचर्य सरणियों नहीं हैं, वे निश्चित रूप से वस्तुओं हैं :) - एक साहचर्य सरणी का काम कर रहे हैं। लेकिन जैसा कि व्यापक बिंदु के संबंध में आपको निश्चित रूप से यह ठीक-ठीक लेख के अनुसार लगता है, जो मुझे मिला:

जावास्क्रिप्ट "साहचर्य Arrays" हानिकारक माना जाता है

लेकिन इस सब के अनुसार, स्वीकार किए जाते हैं जवाब ही बुरा अभ्यास नहीं है?

ऑब्जेक्ट के लिए एक प्रोटोटाइप आकार () फ़ंक्शन निर्दिष्ट करें

यदि ऑब्जेक्ट में कुछ और भी जोड़ा गया है।

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

मुझे नहीं लगता कि उत्तर को स्वीकार किया जाना चाहिए, क्योंकि यदि आपके पास समान निष्पादन संदर्भ में कोई अन्य कोड चल रहा है तो उस पर काम करने के लिए भरोसा नहीं किया जा सकता है। एक मजबूत तरीके से करने के लिए निश्चित रूप से आपको मायरे के भीतर आकार विधि को परिभाषित करने और सदस्यों के प्रकार की जांच करने की आवश्यकता होगी क्योंकि आप उनके माध्यम से पुनरावृति करते हैं।


संपत्ति

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

उपयोग

var o = {a: 1, b: 2, c: 3};
alert(o.length); // <-- 3
o['foo'] = 123;
alert(o.length); // <-- 4

अगर हमारे पास हैश है

हैश = {"ए": "बी", "सी": "डी"};

हम उन लंबाई की लंबाई का उपयोग करके प्राप्त कर सकते हैं जो हैश की लंबाई है:

कुंजी (हैश) .length


आप बस इसकी लंबाई पाने के लिए किसी भी वस्तु पर 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()


इस तरह के किसी चीज़ के बारे में क्या --

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

इस विधि से एक सरणी में आपके सभी ऑब्जेक्ट की संपत्ति के नाम मिलते हैं, इसलिए आप उस सरणी की लंबाई प्राप्त कर सकते हैं जो आपकी ऑब्जेक्ट की कुंजियों की लंबाई के बराबर है।

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

उपयोग:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)


उपरोक्त में से कुछ पर एक भिन्नता है:

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

यह hasOwnProp को एकीकृत करने के लिए थोड़ा अधिक सुरुचिपूर्ण तरीका है।


खेल के लिए थोड़ा देर से, लेकिन इसे प्राप्त करने का एक अच्छा तरीका (IE9 + केवल) लंबाई पर एक जादू पाने वाले को परिभाषित करना है:

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

और आप इसे बस ऐसे ही इस्तेमाल कर सकते हैं:

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

1


नीचे उन लोगों के लिए कॉफी कॉप्स में जेम्स कॉगलन के उत्तर का एक संस्करण है जिन्होंने सीधे जावास्क्रिप्ट को छोड़ दिया है :)

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

मैं एक जावास्क्रिप्ट विशेषज्ञ नहीं हूं, लेकिन ऐसा लगता है कि आपको तत्वों के माध्यम से लूप करना होगा और उन्हें गिनना होगा क्योंकि ऑब्जेक्ट की लंबाई विधि नहीं है:

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

@palmsey: ओपी के लिए निष्पक्षता में, जावास्क्रिप्ट प्रलेखन वास्तव में स्पष्ट रूप से "साहचर्य सरणियों" के रूप में इस प्रकार की वस्तु के चर का उपयोग करने का उल्लेख करता है।


यदि आप 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>

यदि आपको एक साहचर्य डेटा संरचना की आवश्यकता है जो इसके आकार को उजागर करती है, तो किसी ऑब्जेक्ट के बजाय मानचित्र का बेहतर उपयोग करें।

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

यहां एक पूरी तरह से अलग समाधान है जो केवल अधिक आधुनिक ब्राउज़रों (IE9 +, Chrome, Firefox 4+, Opera 11.60+, Safari 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);

यहां बताया गया है कि यह जांचना न भूलें कि संपत्ति प्रोटोटाइप श्रृंखला पर नहीं है:

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

यहां सबसे क्रॉस-ब्राउज़र समाधान है।

यह स्वीकार किए गए उत्तर से बेहतर है क्योंकि यह मौजूद है। इस प्रकार, यह सभी आधुनिक ब्राउज़रों के लिए सबसे तेज़ है।

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;

सबसे सरल है

Object.keys(myObject).length

हम उपयोग करके वस्तु की लंबाई पा सकते हैं:

Object.values(myObject).length

अपडेट किया गया : यदि आप Underscore.js का उपयोग कर रहे हैं। Underscore.js (अनुशंसित, यह हल्का है!), तो आप बस कर सकते हैं

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

यदि नहीं , और आप जो भी कारण के लिए वस्तु गुणों के साथ गड़बड़ नहीं करना चाहते हैं, और पहले से ही jQuery का उपयोग कर रहे हैं, एक प्लगइन समान रूप से सुलभ है:

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

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





javascript-objects