Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Работа с массивом (https://javascript.ru/forum/misc/25392-rabota-s-massivom.html)

strengerst 04.02.2012 00:10

Работа с массивом
 
Это элементарно все навернека знают но просьба мне объяснить.
Массив обладает свойством length - который определяет длину массива, а вот как определить количество элементов в массиве. Ну к примеру:

var massive= new Array();
massive[1]="слово1";
massive[3]="слово2";
massive[5]="слово3";
var f=massive.length;

Так вот переменая f , будет равна значению 6; А как можно получить
количество элементов. В масиве их 3.:-?

devote 04.02.2012 00:14

var massive= new Array();
massive[1]="слово1";
massive[3]="слово2";
massive[5]="слово3";

for(var k in massive ) {
    if ( ~~k == k ) {
        alert( massive[ k ] );
    }
}

strengerst 04.02.2012 00:21

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

strengerst 04.02.2012 00:35

да и еще код мне просто выводит пошагово мои значения через ключ, а мне нужно получить переменную которая будет содержать сумму всех элементов массива. В данном коде к примеру
$l=3;

strengerst 04.02.2012 00:35

да и еще код мне просто выводит пошагово мои значения через ключ, а мне нужно получить переменную которая будет содержать сумму всех элементов массива. В данном коде к примеру $l=3

devote 04.02.2012 00:44

Ну а что вы хотели, вы создаете массив из шести элементов.. и при этом хотите получить только реальные, тоесть назначенные... И конечно же получить/подсчитать их можно только перебором.
var massive= new Array();
massive[1]="слово1";
massive[3]="слово2";
massive[5]="слово3";

var length = 0;
for(var k in massive ) {
    ~~k == k && ++length;
}
alert(length);

strengerst 04.02.2012 01:20

О спасибо начинаю понимать, простите за наглость а не найдете свободную минутку ражевать мне ваш цикл, в учебник написано:
Итерация по свойствам объекта. А вот я не совсем понял как работает ваш цикл, и для чего нужны ~~ , &&- Логическое "И"- Возвращает последний операнд, если все операнды верны. Если хоть один из операндов неверен, то возвратит первый неверный операнд.
Дальше немножко понятно тоже:
length
это обычная переменая которая перед циклом равнялось 0, а в цикле она каждый раз пребовляет по единицы сколько циклов столько и прибовлений блогадоря: + +так как это тоже самое что +1; А вот принцип работы
~~k == k
не могу понять.

devote 04.02.2012 01:28

~ это битовая операция
alert( ~1 ); // меняет биты 0 на 1, а единицы на ноль

тоесть если смотреть в двоичной системе:
00000001 - в десятичной рано 1
после манипуляции через знак ~ будет:
11111110 - тоесть 254 или -1

в нашем случае строку переводим в число:
~~"1" == 1

strengerst 04.02.2012 01:48

ага понятно, не знал что так можно, а если воспользоваться методом
parseInt
ну вроде как:
var length = 0;
for(var k in massive ) {
    parseInt(k) == k && ++length;
}
alert(length);
Или не правильно.

Раед 04.02.2012 01:50

devote,
Цитата:

Сообщение от devote
~~k == k

, а как может быть иначе?

strengerst 04.02.2012 01:52

А цикл я так понял заменяет пошагово все ключи масива на перемену k сколько ключей столько и замен, благодаря чему создаеца цикл.

strengerst 04.02.2012 01:54

не ну я так понял, что ~~ необходимо для получение из стокового значение числовое.

devote 04.02.2012 01:54

Цитата:

Сообщение от Раед
, а как может быть иначе?

с учетом что это массив, мы точно знаем что индексы имеют числовое значение. тоесть при переборе массива у нас попадется не только ключи из чисел но и параметр length
var a = "length";
alert( ~~a == a );


var a = "10";
alert( ~~a == a );


Цитата:

Сообщение от strengerst
Или не правильно.

можно и так

strengerst 04.02.2012 01:55

а можно это зделоть методом parseInt()

devote 04.02.2012 02:01

Цитата:

Сообщение от Maxmaxmaximus
как надо

а ты это в ИЕ запусти... и увидишь иное значение.

devote 04.02.2012 02:04

Цитата:

Сообщение от Maxmaxmaximus
вам бы я посоветовал почитать спецификацию, если интересует могу сказать параграфы.

Вот иди и почитай, знаток.

devote 04.02.2012 02:14

Цитата:

Сообщение от Maxmaxmaximus
специально для IE

ага а если я решил прототип добавить массиву.

Array.prototype.test = {};


var q = []
q[4] = 1
q[66] = 2
q[200] = 3
q[2423] = 4
 
var length = 0
for (var i in q) if(i !="length") {
alert("ПОПАЛСЯ " + ++length)
}
 
alert("ВСЕГО " +length)


Maxmaxmaximus, иди кури маны

strengerst 04.02.2012 02:17

var massive= new Array();
massive[1]="слово1";
massive[3]="слово2";
massive[5]="слово3";

for(var k in massive ) {
    if ( ~~k == k ) {
        alert( massive[ k ] );
    }
}
Цитата:

с учетом что это массив, мы точно знаем что индексы имеют числовое значение. тоесть при переборе массива у нас попадется не только ключи из чисел но и параметр length
Тоесть length откуда он возметься мы же его не задаем? или он по умолчанию будет как ключ массива.

devote 04.02.2012 02:19

Цитата:

Сообщение от strengerst
Тоесть length откуда он возметься мы же его не задаем? или он по умолчанию будет как ключ массива.

в ИЕ он попадает в список перечисляемых.

strengerst 04.02.2012 02:23

Вот спасибо не знал. И чему равно такое значени
massive[ length ]
? в ИЕ

strengerst 04.02.2012 02:28

Цитата:

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

Раед 04.02.2012 02:30

strengerst,
начните с http://learn.javascript.ru/

Раед 04.02.2012 02:31

Цитата:

Сообщение от strengerst
если оно в ИЕ прописываясь автоматически какому равно значению.

помоему такому же, как и в нормальных браузерах

strengerst 04.02.2012 02:34

и какому? согласно кода
var massive= new Array();
massive[1]="слово1";
massive[3]="слово2";
massive[5]="слово3";

for(var k in massive ) {
    if ( ~~k == k ) {
        alert( massive[ k ] );
    }
}
если вывести
Цитата:

massive[length]
чему будет равно в ИЕ не как 6.

strengerst 04.02.2012 02:48

+i == i вот запутался i это ключ массива q в цикле for, а зачем +i == i
объясни не понятливому мне.

strengerst 04.02.2012 02:52

не просто не пойму зачем нужен + перд i

strengerst 04.02.2012 03:01

все понял пока i равен самому себе выполняеться length ++,
как только i ,будет равняться length свойству родительскому, то условие if не сработает. или не прав

Octane 04.02.2012 03:32

Object.keys(q).length
;)

Octane 04.02.2012 05:07

Не понял причем тут length, это свойство выставлено, как enumerable=false, configurable=false
alert(JSON.stringify(Object.getOwnPropertyDescriptor([], "length")))
поэтому в for-in оно не появится никогда, и Object.keys такое свойство пропустит.

Вообще я просто хотел обратить внимание на то, что давно уже не надо городить for-in-hasOwbProperty, а пользоваться Object.keys, который всеми браузерами поддерживается http://kangax.github.com/es5-compat-table/ Для старых браузеров достаточно скопировать код с MDN https://developer.mozilla.org/en/Jav...s#Compatiblity

devote 04.02.2012 05:54

Цитата:

Сообщение от Maxmaxmaximus
я тож так думал, что у него флаг скрытости стоит, но вот devote считает по другому, за что и минусанул мне в карму. А... нет, он минусанул мне за нерабочие примеры, хотя сам сделал нерабочий пример. Точно точно...

Читай посты внимательнее, в ИЕ 7 свойство length является перечисляемым... Так же подобные примеры предотвращают подсчет назначенных прототипов, тоесть считаем то что имеет числовой индекс. Все просто и не надо городить черт знает что. И хорош ныть... не ныть надо а проверять и читать.

Цитата:

Сообщение от Maxmaxmaximus
Object.keys

в осле не поможет.


Я даю примеры решений, которые работают во всех браузерах без исключения, и не пытаюсь дать человеку то после чего он прибежит снова на форум с воплями "а какого йуха не работает в ИЕ"

Octane 04.02.2012 07:19

Цитата:

Сообщение от devote
Читай посты внимательнее, в ИЕ 7 свойство length является перечисляемым...

У тебя бракованный IE7


Цитата:

Сообщение от devote
Я даю примеры решений, которые работают во всех браузерах без исключения, и не пытаюсь дать человеку то после чего он прибежит снова на форум с воплями "а какого йуха не работает в ИЕ"

По твоему всякие indexOf и forEach для массивов тоже забыть?)

devote 04.02.2012 07:32

Цитата:

Сообщение от Octane
У тебя бракованный IE7

возможно и бракованный.
Цитата:

Сообщение от Octane
По твоему всякие indexOf и forEach для массивов тоже забыть?)

а причем тут это вообще? Вы тему топика читали?

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

Octane 04.02.2012 07:40

Цитата:

Сообщение от devote
а причем тут это вообще? Вы тему топика читали?

Цитата:

Сообщение от devote
Я рад что вы стараетесь юзать там супер пупер новые возможности и т.д. но ради мелочной порой задачи, прикручивать либу ради мелких задач не всегда необходимо.

При том что приходится для этих методов дополнительный код в IE подключать, поэтому Object.keys еще добавить не проблема.

Цитата:

Сообщение от devote
Человеку нужно посчитать количество реальных элементов.

Object.keys(array).length тоже является решением этой задачи.

Цитата:

Сообщение от devote
Не понимаю что вам все никак не успокоиться.

Просто общаемся

devote 04.02.2012 08:11

Цитата:

Сообщение от Octane
Object.keys(array).length тоже является решением этой задачи.

никто не спорит... яж не отрицал этого нигде...

strengerst 04.02.2012 14:40

Спасибо за вашу помощь и отзывчмвость. Всем спасибо что откликнулись.:thanks: .

Octane 04.02.2012 16:24

Цитата:

Сообщение от Maxmaxmaximus
Array.prototype.count = function(){
	var l = 0;
	Object.keys(this).forEach(function(a){ +a == a && l++ })
	return l
}

Array.prototype.count = function () {
	return Object.keys(this).filter(isFinite).length;
};
;)

Octane 04.02.2012 16:29

https://developer.mozilla.org/en/Jav.../Array#Methods

Kolyaj 04.02.2012 16:33

Вообще-то зря вы тут про Object.keys вспомнили, он не про массивы.

Array.prototype.count = function() {
    return this.reduce(function(x) { return x + 1; }, 0);
};


Часовой пояс GMT +3, время: 17:17.