Как зайти в Даркнет?!
25th January, 01:11
6
0
Как в tkinter из поля ввода Entry получить значение в одну переменную и обновить строку кнопкой, затем получить ещё одно введённое значение и затем сложить их. Ниже пример кода
21st July, 19:00
895
0
Программа, которая создает фейковые сервера в поиске игровых серверов CS 1.6 Steam
21st March, 17:43
948
0
Очень долго работает Update запрос Oracle
27th January, 09:58
914
0
не могу запустить сервер на tomcat HTTP Status 404 – Not Found
21st January, 18:02
906
0
Где можно найти фрилансера для выполнения поступающих задач, на постоянной основе?
2nd December, 09:48
938
0
Разработка мобильной кроссплатформенной военной игры
16th July, 17:57
1724
0
период по дням
25th October, 10:44
3955
0
Пишу скрипты для BAS только на запросах
16th September, 02:42
3720
0
Некорректный скрипт для закрытия блока
14th April, 18:33
4613
0
прокидывать exception в блоках try-catch JAVA
11th March, 21:11
4381
0
Помогите пожалуйста решить задачи
24th November, 23:53
6086
0
Не понимаю почему не открывается детальное описание продукта
11th November, 11:51
4351
0
Нужно решить задачу по программированию на массивы
27th October, 18:01
4396
0
Метода Крамера С++
23rd October, 11:55
4309
0
помогите решить задачу на C++
22nd October, 17:31
4002
0
Помогите решить задачу на python с codeforces
22nd October, 11:11
4492
0
Python с нуля: полное руководство для начинающих
18th June, 13:58
2599
0
Длина объекта JavaScript
Если у меня есть объект JavaScript, скажем
var myObject = new Object();
myObject["firstname"] = "Gareth";
myObject["lastname"] = "Simpson";
myObject["age"] = 21;
существует ли встроенный или общепринятый наилучший способ получения длины этого объекта?
Самый надежный ответ (т. е. тот, который отражает намерение того, что вы пытаетесь сделать, вызывая при этом наименьшее количество ошибок) был бы следующим::
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 года и широко распространенное deployment из ES5 и за его пределами. Для IE9+ и всех других современных браузеров с поддержкой ES5+ вы можете использовать Object.keys() , поэтому приведенный выше код просто становится:
var size = Object.keys(myObj).length;
Это не должно изменить ни один существующий прототип, так как Object.keys() теперь встроен.
Edit: объекты могут иметь символические свойства, которые не могут быть возвращены с помощью метода 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
Обновлено : если вы используете Underscore.js (рекомендуется, он легкий!), то вы можете просто сделать
_.size({one : 1, two : 2, three : 3});
=> 3
Если нет, и вы не хотите возиться со свойствами объекта по какой-либо причине, и уже используете jQuery, плагин одинаково доступен:
$.assocArraySize = function(obj) {
// http://stackoverflow.com/a/6700/11236
var size = 0, key;
for (key in obj) {
if (obj.hasOwnProperty(key)) size++;
}
return size;
};
Вот самое кроссбраузерное решение.
Это лучше, чем принятый ответ, потому что он использует native 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;
Я не эксперт JavaScript, но похоже, что вам придется перебирать элементы и подсчитывать их, так как объект не имеет метода длины:
var element_count = 0;
for (e in myArray) { if (myArray.hasOwnProperty(e)) element_count++; }
@palmsey: справедливости ради к OP, документация JavaScript фактически явно ссылается на использование переменных типа Object таким образом, как "associative arrays".
Чтобы не возиться с прототипом или другим кодом, вы можете построить и расширить свой собственный объект:
function Hash(){
var length=0;
this.add = function(key, val){
if(this[key] == undefined)
{
length++;
}
this[key]=val;
};
this.length = function(){
return length;
};
}
myArray = new Hash();
myArray.add("lastname", "Simpson");
myArray.add("age", 21);
alert(myArray.length()); // will alert 2
Если вы всегда используете метод add, свойство length будет правильным. Если вы боитесь, что вы или другие люди забудут о его использовании, вы можете добавить счетчик свойств, который другие отправили в метод длины.
Конечно, вы всегда можете переписать методы. Но даже если вы это сделаете, ваш код, вероятно, будет заметно сбоить, что облегчит его отладку. ;)
Вот совершенно другое решение, которое будет работать только в более современных браузерах (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);
@palmsey: справедливости ради к OP, документы javascript фактически явно ссылаются на использование переменных типа Object таким образом, как "associative arrays".
@palmsey: справедливости ради к OP, документы javascript фактически явно ссылаются на использование переменных типа Object таким образом, как "associative arrays".
И по справедливости к @palmsey он был совершенно прав, это не ассоциативные массивы, это определенно объекты :) - выполняющие работу ассоциативного массива. Но что касается более широкого вопроса Вы определенно имеете на это право согласно этой довольно прекрасной статье которую я нашел:
JavaScript “Associative Arrays” Считается Вредным
Но в соответствии со всем этим, разве сам по себе принятый ответ не является плохой практикой?
Укажите прототип size() функции для объекта
Если что-то еще было добавлено в объект .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 и проверить тип членов, когда вы будете перебирать их.
Если вы используете 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>
Если вы не заботитесь о поддержке Internet Explorer 8 или ниже, вы можете легко получить количество свойств в объекте, применив следующие два шага:
- Выполните команду
Object.keys(), чтобы получить массив, содержащий имена только тех свойств, которые являются перечисляемыми , илиObject.getOwnPropertyNames(), если вы хотите также включить имена свойств, которые не являются перечисляемыми. - Получите свойство
.lengthэтого массива.
Если вам нужно сделать это несколько раз, вы можете обернуть эту логику в функцию:
function size(obj, enumerablesOnly) {
return enumerablesOnly === false ?
Object.getOwnPropertyNames(obj).length :
Object.keys(obj).length;
}
Как использовать эту конкретную функцию:
var myObj = Object.create({}, {
getFoo: {},
setFoo: {}
});
myObj.Foo = 12;
var myArr = [1,2,5,4,8,15];
console.log(size(myObj)); // Output : 1
console.log(size(myObj, true)); // Output : 1
console.log(size(myObj, false)); // Output : 3
console.log(size(myArr)); // Output : 6
console.log(size(myArr, true)); // Output : 6
console.log(size(myArr, false)); // Output : 7
Смотрите также этот Fiddle для демонстрации.
Вот другая версия ответа Джеймса Когана. Вместо того чтобы передавать аргумент, просто создайте прототип класса объекта и сделайте код чище.
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/
Вы можете просто использовать 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()