Длина объекта JavaScript - PullRequest
       305

Длина объекта JavaScript

2089 голосов
/ 07 августа 2008

Если у меня есть объект JavaScript, скажем

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

Есть ли встроенный или общепринятый способ получения длины этого объекта?

Ответы [ 36 ]

15 голосов
/ 02 августа 2013

Это совершенно другое решение, которое будет работать только в более современных браузерах (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);
15 голосов
/ 29 июля 2011

В некоторых случаях лучше просто сохранить размер в отдельной переменной. Особенно, если вы добавляете в массив по одному элементу в одном месте и можете легко увеличить размер. Очевидно, это будет работать намного быстрее, если вам нужно будет часто проверять размер.

14 голосов
/ 31 мая 2016

Использование:

var myArray = new Object();
myArray["firstname"] = "Gareth";
myArray["lastname"] = "Simpson";
myArray["age"] = 21;
obj = Object.keys(myArray).length;
console.log(obj)
13 голосов
/ 09 августа 2008

@ palmsey: Справедливости ради OP, документы javascript фактически явно ссылаются на использование переменных типа Object таким образом, как «ассоциативные массивы».

И, честно говоря, @palmsey он был совершенно прав: они не ассоциативные массивы, а определенно объекты :) - выполняющие работу ассоциативного массива. Но что касается более широкой темы, вы определенно имеете на это право в соответствии с этой довольно прекрасной статьей, которую я нашел:

JavaScript «Ассоциативные массивы» считается вредным

Но в соответствии со всем этим, не является ли принятый ответ самой плохой практикой?

Укажите функцию прототипа size () для объекта

Если что-то еще было добавлено в 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>

Я не думаю, что ответ должен быть принят, так как ему нельзя доверять, если у вас есть другой код, работающий в том же контексте выполнения. Чтобы сделать это надежным способом, вам наверняка понадобится определить метод size в myArray и проверять тип элементов при их итерации по ним.

11 голосов
/ 09 февраля 2014

Если у нас есть хэш

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

мы можем получить длину, используя длину ключей, которая равна длине хеша:

ключи (хэш) .length

11 голосов
/ 24 августа 2011

Как насчет этого -

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--; }}
}
10 голосов
/ 06 июня 2018

<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;
10 голосов
/ 15 сентября 2015

Если вы используете 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>
9 голосов
/ 18 мая 2016

Если вам нужна ассоциативная структура данных, которая показывает ее размер, лучше использовать карту вместо объекта.

var myMap = new Map();
myMap.set("firstname", "Gareth");
myMap.set("lastname", "Simpson");
myMap.set("age", 21);
myMap.size; // 3
7 голосов
/ 06 апреля 2018
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
  1. Object.values ​​(MyObject) .length
  2. Object.entries (MyObject) .length
  3. Object.keys (MyObject) .length
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...