Оператор == на списках и dicts не сравнивает идентификаторы объектов, чтобы увидеть, являются ли они одним и тем же объектом. Для этого используйте obj1 is obj2
.
Вместо этого оператор == сравнивает членов списка из dict, чтобы узнать, совпадают ли они.
Самый устойчивый ответ (т.е. это получает намерение того, что Вы пытаетесь сделать при порождении наименьшего количества ошибок), был бы:
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);
существует своего рода конвенция в JavaScript, что Вы не добавляете вещи к 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
Я не эксперт JavaScript, но похоже, что необходимо было бы циклично выполниться через элементы и считать их, так как Объект не имеет метода длины:
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey: Объективности ради по отношению к OP документация JavaScript на самом деле явно относится к использованию переменных текстового объекта этим способом как "ассоциативные массивы".
Вот то, как и не забывают проверять, что свойство не находится на опытной цепочке:
var element_count = 0;
for(var e in myArray)
if(myArray.hasOwnProperty(e))
element_count++;
@palmsey: Объективности ради по отношению к OP документы JavaScript на самом деле явно относятся к использованию переменных текстового объекта этим способом как "ассоциативные массивы".
И объективности ради по отношению к @palmsey он был довольно корректен, они не ассоциативные массивы, они - определенно объекты :) - выполнение задания ассоциативного массива. Но в отношении более широкой точки Вы определенно, кажется, имеете право его в соответствии с этой довольно прекрасной статьей, которую я нашел:
“Associative Arrays” JavaScript, Продуманный Вредный
, Но согласно всему этому, [разве] эти , не принят, отвечают самому плохая практика?
Указывают опытный размер () функция для Объекта
, Если что-либо еще было добавлено для Возражения .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 и проверке на тип участников, поскольку Вы выполняете итерации через них.
Используйте Object.keys(myObject).length
для получения длины объекта/массива
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
console.log(Object.keys(myObject).length); //3
У меня была подобная потребность вычислить пропускную способность, используемую объектами, полученными по websocket. Просто нахождение длины объекта Stringified было достаточно для меня.
websocket.on('message', data => {
dataPerSecond += JSON.stringify(data).length;
}