Какой самый быстрый способ подсчитать количество ключей / свойств объекта? Возможно ли это сделать без перебора объекта? т.е. без выполнения

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

(Firefox действительно предоставил магическое свойство __count__, но это было удалено где-то в версии 4. )

Чтобы сделать это в любом Это работает только с сайтами с поддержкой jQuery , и это будет работать. Это просто назначение переменной javascript, а затем передача значения существующей переменной php. Поскольку php пишет здесь строки javascript, он имеет значение переменной php и может передавать ее напрямую. версия узла , Chrome, IE 9, Firefox 4 или Safari 5:

Object.keys(obj).length

Простой JavaScript:

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;

Если вы используете цикл Underscore.js вы можете использовать _. Size (спасибо @douwe):
_.size(obj)

2. _. Keys , что для некоторых может быть понятнее: В противном случае я поддерживаю ответ @ Avi. Я отредактировал его, добавив ссылку на документ MDC, который включает метод keys (), который можно добавить в браузеры не-ECMA5.
_.keys(obj).length

События, связанные с объектом $ scope, просто работают в контроллере владельца. Связь между контроллерами осуществляется через $ rootScope или Services.

Стандартная реализация Object (

ES5.1 Object Внутренние свойства и методы без явной или неявной итерации его ключей. будет иметь последнее значение для всех обратных вызовов. Object для отслеживания количества ключей / свойств, поэтому не должно быть стандартного способа определения размера Object Внутренне

Итак, вот наиболее часто используемые альтернативы:

1. Object.keys ()

Object.keys(obj).length; Работает Минусы Первая форма — это

  • все еще работают. — Читаемый и чистый синтаксис. Библиотека или пользовательский код не требуются, за исключением прокладки, если встроенная поддержка недоступна.
  • 2. Решения на основе библиотеки — Переполнение памяти из-за создания массива.

2. Решения на основе библиотек

Многие примеры на основе библиотек, приведенные в других разделах этого раздела, являются полезными идиомами в контексте их библиотеки. С точки зрения производительности, однако, выиграть нечего по сравнению с идеальным кодом без библиотеки, поскольку все эти библиотечные методы на самом деле инкапсулируют либо цикл for, либо ES5 Object.keys (нативный или отстраненный).

таймера — вызовы

Переменная slowest part такого цикла for обычно является вызовом .hasOwnProperty() из-за накладных расходов на вызов функции. Поэтому, когда мне просто нужно количество записей в объекте JSON, я просто пропускаю вызов .hasOwnProperty(), если я знаю, что ни один код не выполнял и не будет расширять Object.prototype Глядя на вывод

В противном случае ваш код можно было бы немного оптимизировать, сделав k local (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;

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

и мне нужно было только сделать:

Когда вы выполните POST на шаге 2, ваш браузер отправит на сервер метод «OPTIONS». Это «фыркание» браузером, чтобы увидеть, крут ли сервер, когда вы размещаете на нем сообщение. Сервер отвечает «Access-Control-Allow-Origin», сообщая браузеру «OK», чтобы он POST | GET | ORIGIN, если запрос исходил из «getNumberOfProperties(object) и работа с ним. {* } При отладке, если вы просто хотите увидеть события, я рекомендую либо …

Я не знаю ни одного способа сделать это, однако, чтобы свести итерации к минимуму, вы можете попробовать проверить наличие __count__ и если он не существует (то есть не Firefox), то вы можете перебрать объект и определить его для дальнейшего использования, например:

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

, но переназначение запрещено. __count__, и это будет сделано, и итерации будут выполняться только для тех, которые не «т. Если счетчик меняется и вы не можете этого сделать, вы всегда можете сделать его функцией:

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

Таким образом, каждый раз, когда вы ссылаетесь на myobj. __count__ функция будет запущена и пересчитана.

Как заявлено Avi Flax, 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

# 1042

Итерирование ответа Avi Flax. Object.keys (obj) .length правильно для объекта, к которому не привязаны функции шаги, чтобы избежать этого:

Пример:

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. , а также его источник на github и другую другую информацию

  2. В следующем коде используется похожая логика, но вместо этого генерируется 32-разрядное целое число, поскольку это самый большой общий целочисленный размер, который может быть представлен стандартом JavaScript Object.keys(obj).length С чем вы столкнулись

Тот же кусок кода с обычными функциями:

документацию можно найти здесь (и многие старые, которые не являются древними) поддерживают И, наконец, реализацию lodash Для тех, у кого есть Underscore.js, включенный в их проект, вы можете сделать:

Object.defineProperty (obj, prop, descriptor) https://lodash.com/docs # size

_.size(obj)

Вы можете добавить его ко всем вашим объектам:

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

,

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

From: Difference

Или к одному объекту:

Добавленный таким образом, он не будет отображаться в циклах for..in:

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

Примечание: оно не работает в & Lt ; браузерах IE9.

например, нам нужно преобразовать 2-ю дату: Object.keys(obj).length

, мы предлагаем использовать ее вместо использования свойств объекта. класс в ES6, я бы Для тех, кто имеет Ext JS 4 в своем проекте, вы можете: найти длину объекта JSON, имеющего ключевые данные

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

Я решил эту проблему, построив свою собственную реализацию базового списка, который хранит записи о том, сколько элементов хранится в объекте. Это очень просто. Примерно так:

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

посмотреть на goog.Object Documentation

Ext.Object.getSize(myobj);

Преимуществе этого метода в том, что он будет работать во всех совместимых с Ext браузерах (включая IE6-IE8), однако я считаю, что время выполнения не лучше, чем O (n), как и в случае других предлагаемых решений.

Надеюсь, это поможет :)

$(Object.Item).length

Вы можете использовать Object.keys(data).length Вы можете использовать:

. Я не думаю, что это возможно (по крайней мере, без использования некоторых внутренних компонентов). И я не думаю, что вы бы много выиграли, оптимизировав это.

Я пытаюсь сделать его доступным для всех объектов, например:

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

В Google Closure есть хорошая функция для этого … goog.object.getCount (obj)

javascript — Frame Buster Buster … необходим код Buster — Переполнение стека

Допустим, вы не хотите, чтобы другие сайты «вставляли» ваш сайт в Object.keys(objectName).length;
& Object.values(objectName).length;

во всех браузерах.

JSON.parse(array).lenght