string方法 - javascript數字長度




JavaScript對象的長度 (20)

@palmsey:公平地看待這個OP,這個javascript文檔實際上明確提到了以這種方式使用Object類型的變量作為“關聯數組”。

公平地說,@palmsey他非常正確,他們不是關聯數組,他們絕對是對象:) - 完成關聯數組的工作。 但關於更廣泛的觀點,根據我發現的這篇相當精美的文章,你肯定有權利:

JavaScript“關聯數組”被認為是有害的

但是根據所有這些,不是被接受的答案本身不好的做法?

為Object指定原型大小()函數

如果任何其他內容已添加到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中定義size方法,並在遍歷它們時檢查成員的類型。

如果我有一個JavaScript對象,說

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

是否有一種內置或接受的最佳實踐方式來獲取此對象的長度?


屬性

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

簡單方案:

  var myObject = {};      // ... your object goes here.

  var length = 0;

  for (var property in myObject) {
    if (myObject.hasOwnProperty(property)){
      length += 1;
    }
  };

  console.log(length);    // logs 0 in my example.

下面是James Coglan在CoffeeScript中為那些已經放棄JavaScript的人的回答的一個版本:)

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

以下是如何以及不要忘記檢查該屬性是否在原型鏈上:

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

你可以簡單地在任何對像上使用Object.keys(obj).length來獲得它的長度。 Object.keys返回一個包含所有對象關鍵字 (屬性)的數組,這些關鍵字可以派上用場,以便使用相應數組的長度來查找該對象的長度。 你甚至可以為此寫一個函數 。 讓我們變得富有創造力並為它寫一個方法 (以及一個更加方便的getter屬性):

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


使用:

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


像大多數JavaScript問題一樣,有很多解決方案。 您可以擴展對象,以便像許多其他語言的詞典(+第一類公民)那樣進行更好或更差的操作。 沒有錯,但另一個選擇是構建一個新的對象,以滿足您的特定需求。

function uberject(obj){
    this._count = 0;
    for(var param in obj){
        this[param] = obj[param];
        this._count++;
    }
}

uberject.prototype.getLength = function(){
    return this._count;
};

var foo = new uberject({bar:123,baz:456});
alert(foo.getLength());

如果你正在使用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>

如果你知道你不必擔心hasOwnProperty檢查,你可以很簡單地做到這一點:

Object.keys(myArray).length

如果您需要公開其大小的關聯數據結構,最好使用地圖而不是對象。

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

如果我們有散列

hash = {“a”:“b”,“c”:“d”};

我們可以使用密鑰長度來得到長度:

鍵(散列)。長度


您可以始終使用Object.getOwnPropertyNames(myObject).length獲得與[].length為普通數組提供的相同結果。


我不是一個JavaScript專家,但它看起來像你將不得不遍曆元素並對它們進行計數,因為Object沒有長度方法:

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

@palmsey:為了公平性,JavaScript文檔實際上明確提到了以這種方式使用Object類型的變量作為“關聯數組”。


最強大的答案(即捕捉你想要做的事情的意圖,同時導致最少的錯誤)將是:

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(myArray);

在JavaScript中有一種約定,你不會將事物添加到Object.prototype中 ,因為它可能會破壞各種庫中的枚舉。 不過,向Object添加方法通常是安全的。

這是2016年的更新以及ES5及其以後的廣泛部署 對於IE9 +和所有其他現代ES5 +瀏覽器,您可以使用Object.keys()以便上面的代碼變為:

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

由於現在內置了Object.keys()因此不需要修改任何現有的原型。


有點遲到的遊戲,但一個很好的方式來實現這一點(僅限IE9 +)是在長度屬性上定義一個神奇的getter:

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

你可以像這樣使用它:

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

會給1


這個方法獲取數組中所有對象的屬性名稱,因此您可以獲取該數組的長度,該長度等於對象的鍵的長度。

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

這是James Cogan的答案的另一個版本。 不要傳遞參數,只需創建Object類的原型,並使代碼更清晰。

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/ : http://jsfiddle.net/qar4j/1/


這是最多的跨瀏覽器解決方案。

這比接受的答案要好,因為如果存在,它使用本機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;

那樣的事情呢 -

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




javascript-objects