LINUX.ORG.RU

Ответ на: комментарий от muu

У меня проблемы еще сам джаваскрипт вызывает, к сожалению. Хотелось бы видеть вариант с for/in вместо классического for.

muu
() автор топика
Ответ на: комментарий от muu

>У меня проблемы еще сам джаваскрипт вызывает, к сожалению. Хотелось бы видеть вариант с for/in вместо классического for.

Если массив вызывает проблемы, то стоит ли? :}

Deleted
()
Ответ на: комментарий от Deleted

нужда)
да и с массивами вроде разобрался, просто спать надо нормально. Однако джаваскрипт в отладке не так прост как мне казалось. Пойду jQuery мучать.

muu
() автор топика
Ответ на: комментарий от muu

>Однако джаваскрипт в отладке не так прост как мне казалось.

Джаваскрипт в отладке просто прекрасен, как и любой интерпретируемый язык.

Берёшь firebug, открываешь там js консоль и/или тыкаешь брейкпоинты по коду и вперёд. И обычно достаточно такой вещи как console.log.

anonymous
()
Ответ на: комментарий от muu

а зачем?

for in нужен для обхода хэш мапы (объекта), или массива где есть не все индексы. Тут то такое зачем, можно заменить for (i=0;i<o.length;i++) на for (i in o), где o это массив, но зачем?

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

Согласен, просто то был сферический пример. В общем, я просто хотел сделать выделение столбца таблицы.

muu
() автор топика
Ответ на: комментарий от muu

например так получить все элементы колонки в массив. не тестировал.

function getCol(tbl,n){
   var res = [];
   var table = document.getElementById(tbl);
   var trList= table.getElementsByTagName('tr');
   for (i=0;i<trList.length;i++){
     res[]=trList[i].getElementsByTagName('td')[n];
   }

   /* или хотя не уверен так:
   var res = trList.map(function(f){ return f.getElementsByTagName('td')[n]; });  */
   return res;
}


qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>res[]=trList[i].getElementsByTagName('td')[n];

res.push(trList[i].getElementsByTagName('td')[n]);

А любителям оптимизации можно посоветовать:

for (i=0;i<trList.length;i++){

for (var i=0, j=trList.length; i < j; i++) {

Это если движок задумает вычислять length каждый раз заново.

anonymous
()
Ответ на: комментарий от qnikst

Спасибо!
// Второй способ таки не сработал:

FF: trList.map is not a function
Chrome: Uncaught TypeError: Object #<a NodeList> has no method 'map'

muu
() автор топика
Ответ на: комментарий от muu
Array.prototype.map = function(fnc) {
    var a = new Array(this.length);
    for (var i = 0; i < this.length; i++) {
        a[i] = fnc(this[i]);
    }
    return a;
}

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

qnikst ★★★★★
()
Ответ на: комментарий от Dobriy_i_Prostoy

Для этого лучше использовать jQuery - там это делается существенно проще

Присоединяюсь к совету. jquery значительно облегчает жизнь.

Например, добавить новый класс ко всем ячейкам таблицы:

$("#table_id > tbody > td")
  .addClass("some-my-css-class");
Или, например, пронумеровать ячейки таблицы:
var count=0;

$("#table_id > tbody > td")
  .each(function(_index,_td){
  $(_td).html(count);
  count++;
});
Прелесть jquery в том, что он позволяет получить доступ к элементам ровно точно также, как это делается в css - всё очень просто.

just try... :)

Slavaz ★★★★★
()
Ответ на: комментарий от qnikst

>Тут то такое зачем, можно заменить for (i=0;i<o.length;i++) на for (i in o), где o это массив, но зачем?

Для лаконичности и красоты кода. Некоторые еще пишут по одной команде на строчку и с отступами, слыхал?

Zhid
()
Ответ на: комментарий от Zhid

for in это палка о трёх концах :} Например, dev.opera, говорит, что

The for-in loop has its place, but is often misused, when a normal for loop would be more appropriate. The for-in loop requires the script engine to build a list of all the enumerable properties, and check for duplicates in that list, before it can start the enumeration.

Very often, the script itself already knows what properties must be enumerated. In many cases, a simple for loop could be used to step through those properties, especially if they are named using sequential numbers, such as with an array, or an object that is given properties to make it appear to be an array (an example would be a NodeList object created by DOM).

Deleted
()
Ответ на: комментарий от Zhid

«красота и лаконичность кода» теперь эквивалетно непониманию того с чем работашь и как это устроено внутри? ^_^

Некоторые еще пишут по одной команде на строчку и с отступами, слыхал?

твой юмор слегка не ясен ( и не уместен в любом случае)

qnikst ★★★★★
()
Ответ на: комментарий от Slavaz

Прелесть jQuery в том, что он позволяет сделать кучу огромных тормозящих наворотов там, где можно было бы обойтись 2-3мя менее красивыми, но более уместными командами javascript.

Хотя не буду спорить, что jQuery удобная и хорошая штука (в подходящих задачах), но перед тем как её использовать, ИМХО сначала стоит изучить основы js.

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>Прелесть jQuery в том, что он позволяет сделать кучу огромных тормозящих наворотов там, где можно было бы обойтись 2-3мя менее красивыми, но более уместными командами javascript.

Иногда нужно не 2-3 команды, а 5-10 и более. По сути приходится делать то, что уже написано в jquery.

ИМХО сначала стоит изучить основы js.

Естественно.

anonymous
()
Ответ на: комментарий от qnikst

>«красота и лаконичность кода» теперь эквивалетно непониманию того с чем работашь и как это устроено внутри?

Да нет, конечно, все как обычно.
for x in array //14 знаков
for (var i = 0; i < array.length; i++) //39 знаков

При том, что
var array = new Array()
array[0] = 'something'
array[10000] = 'something'
alert(array.length) // 10001

Следовательно, если такой массив попадет в for (;;), произойдет 9999 лишних циклов. А у тебя не может быть гарантий, что перебираться будут элементы «правильного» массива.

Применение for in в данном случае обусловлено самой логикой языка.

Прелесть jQuery в том, что он позволяет сделать кучу огромных тормозящих наворотов там, где можно было бы обойтись 2-3мя менее красивыми, но более уместными командами javascript.

Прелесть jQuery в том, что он позволяет сделать кучу разных кроссбраузерных вещей.
Просто рано или поздно люди начинают уставать писать функции для всех браузеров и такие же, но под другим именем - для файерфокса или ie, избегать каких-то свойств и делать проверки юзерклиента перед каждым созданием объекта итп. Тогда они используют для подобных вещей библиотеки, оптимизированные сотнями разработчиков, а сами занимаются своим делом.

Zhid
()
Ответ на: комментарий от Zhid

>При том, что

var array = new Array()

array[0] = 'something'


array[10000] = 'something'



Расстрелять :} Сначала создаём себе проблемы, потом героически их преодолеваем.

Применение for in в данном случае обусловлено самой логикой языка.


См. заметку выше. Также, push() подсказать?

Deleted
()
Ответ на: комментарий от anonymous

> Иногда нужно не 2-3 команды, а 5-10 и более. По сути приходится делать то, что уже написано в jquery

в случае, когда jQuery используют только для $(«#foo»).smth() или $(«foo[bar=zar]»), потому, что похоже на css, то можно расстреливать.

хотя это не отменяет необходимости js.

qnikst ★★★★★
()
Ответ на: комментарий от Zhid

к тому, что в символах код мерять минимум глупо:

qsort [] = [] 
qsort (x:xs) = qsort (filter (< x) xs) ++ [x] ++ qsort (filter (>= x) xs)

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

наглядно?

у меня for(i будет использоваться для массива, что такое массив тебе наверняка рассказывали. Так же как и то, чем массив отличается множества (set {}), чем по сути являются объекты в js.

for in нужно там, где перебираются элементы множества {}, о которых ты ничего сказать не можешь сказать заранее. Это более медленная вещь требующая дополнительных накладных расходов, непонимание этого говорит о плохом понимании того как всё работает.

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

Прелесть jQuery в том, что он позволяет сделать кучу разных кроссбраузерных вещей.

jQuery хороший инструмент, которым нужно уметь пользоваться. Для очень многих задач это пушка по воробьям. Кроссбраузерные вещи можно писать и без него, так же как jQuery не гарантирует полной кроссбраузерности и можно словить косяки. Чтобы понимать когда оно надо нужно знать js ^_^ (о чём я и говорил)

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>Кроссбраузерные вещи можно писать и без него

К сожалению, в любом современном проекте, где кода больше, чем 50 строчек, писать кроссбраузерно - тратить огромное количество времени впустую.

anonymous
()
Ответ на: комментарий от Deleted

>Расстрелять :} Сначала создаём себе проблемы, потом героически их преодолеваем.

4.2 x 2.

1. Это не проблема, это логика языка. Если у вас си-плюс-плюсы головного мозга, это еще не значит, что весь код и все кодеры будут следовать правилам, установленным C++.

2. Это не героическое преодоление проблем. for in - это легко и красиво, гораздо легче, чем for (;;) и понятнее, правда? Безусловно, если у вас в мозгу установлены какие-то скрытые переключатели и вы испытываете адскую боль при набирании слова in, то это можно назвать героическим преодолением. Тем не менее, абсолютное большинство скрытых переключателей в голове не имеет.

См. заметку выше. Также, push() подсказать?


Перевод: «Вы делаете все через задницу, сейчас я покажу вам, как делать правильно - через жопу».

Zhid
()
Ответ на: комментарий от qnikst

>Кроссбраузерные вещи можно писать и без него

Можно. Можно драить унитаз зубной щеткой. Можно есть суп вилкой.
Но, собственно, зачем?

Для очень многих задач это пушка по воробьям.


24 килобайта при первом посещении сайта - это, конечно, пушка. Пушища, пушкенция.

Zhid
()
Ответ на: комментарий от Zhid

>Это не проблема, это логика языка.

Где логика языка? Если ты массив от хэша не отличаешь, то ты ССЗБ.

2. Это не героическое преодоление проблем. for in - это легко и красиво, гораздо легче, чем for (;;) и понятнее, правда?


Ты хотел сказать медленнее, не так ли? Что непонятного в for()? Ты в 1ый раз цикл увидел?

Перевод: «Вы делаете все через задницу, сейчас я покажу вам, как делать правильно - через жопу».


Метод массива push() через жопу? Tell me more, малыш.

Deleted
()
Ответ на: комментарий от Zhid

>24 килобайта при первом посещении сайта

Бгг. Может твой браузер прямо пожатый скрипт и выполняет? Сотню кило придётся перемолоть браузеру ни на что, из-за того, что кому-то понадобилось сделать мелочь на пару десятков строк. Вы не на жабе в основное время пишете, случаем?

Deleted
()
Ответ на: комментарий от Zhid

я уже писал выше, что я считаю неправильным использованием jQuery и где он нужен, повторяться смысла не вижу.

qnikst ★★★★★
()
Ответ на: комментарий от Deleted

> Где логика языка? Если ты массив от хэша не отличаешь, то ты ССЗБ

+1e999

qnikst ★★★★★
()
Ответ на: комментарий от Zhid

к вопросу 24 кб.

советую засечь как будет отличаться скорость выполнения, хотя бы $(«#foo») и document.getElementById(«foo») или $(foo).filter с аналогичным решением на js.

qnikst ★★★★★
()
Ответ на: комментарий от Deleted

>Где логика языка? Если ты массив от хэша не отличаешь, то ты ССЗБ.

Поскольку в JS все массивы - хэши, «аргумент» не катит.

Метод массива push() через жопу? Tell me more, малыш.


Метод массива


Ты уж определись. Чем работа с массивом, как с объектом лучше, чем работа с массивом, как хэшем?

Ты хотел сказать медленнее, не так ли? Что непонятного в for()? Ты в 1ый раз цикл увидел?


А что непонятного в for in?

Бгг. Может твой браузер прямо пожатый скрипт и выполняет?


Как он его парсит - его личное дело.
Мною особых проблем при открытии сайтов с jQuery не было. Сайты с jQuery, Prototype, ExtJS, MoreSomeShitLib и др. - это да, но за такое, конечно, руки можно и нужно отрывать.

Zhid
()
Ответ на: комментарий от qnikst

>советую засечь как будет отличаться скорость выполнения, хотя бы $(«#foo») и document.getElementById(«foo») или $(foo).filter с аналогичным решением на js.

Советую засечь, как будет отличасть скорость выполнения хотя бы $(".somesel") и функции, выбирающей из DOM все элементы с классом somesel (кроссбраузерной).

Zhid
()
Ответ на: комментарий от Zhid

>Поскольку в JS все массивы - хэши, «аргумент» не катит.

Для тех, кто в танке — функции, указанные топикстертером (и вообще сами по себе) не имеют привычки выдавать то одно, то другое, по желанию левой пятки.

Ты уж определись. Чем работа с массивом, как с объектом лучше, чем работа с массивом, как хэшем?


Ты не понимаешь разницу между массивом, хэшем и объектом? До чего дошёл мир… push() был предложен, что бы не писать от руки индексы, возможно их пропуская (спасение от случайности то бишь). Если ключ не несёт смыслового значения (а в варианте топикстартера это так), то не нужно зря грузить машину этим.

А что непонятного в for in?


Он медленный. См. также следующее.

Как он его парсит - его личное дело.


Твои пользователи тоже работают только с одной страницей твоего сайта и больше никаких других страниц не открывают? Откроешь несколько ссылок, что б потом почитать или посмотреть, надо ли оно вообще, и каждая страница (сайты то разные) будут тянуть свои jQuery или прочие JS фреймворки. Очень способствует отзывчивости интерфейса и пожираемой браузером памяти, я полагаю.

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

Deleted
()
Ответ на: комментарий от Deleted

>Ты не понимаешь разницу между массивом, хэшем и объектом?

Ты не понимаешь разницуу между C++ и JS?

Он медленный.


Нет такого понятия на клиенте.

Твои пользователи тоже работают только с одной страницей твоего сайта и больше никаких других страниц не открывают? Откроешь несколько ссылок, что б потом почитать или посмотреть, надо ли оно вообще, и каждая страница (сайты то разные) будут тянуть свои jQuery или прочие JS фреймворки.


Уж сколько раз твердили миру, что скрипты кэшируются браузером и скачиваются один раз при первом посещении сайта.

Zhid
()
Ответ на: комментарий от Zhid

>Ты не понимаешь разницуу между C++ и JS?

А почему вы отвечаете вопросом на вопрос? Вы таки антисемит?

Уж сколько раз твердили миру, что скрипты кэшируются браузером и скачиваются один раз при первом посещении сайта.


NEWSFLASH.

1. сайтов на свете больше одного.
2. пользователи открывают не только один сайт за раз.
3. обрабатывать этот шмоток яваскрипта всё равно нужно даже в пределах одного сайта.

Deleted
()
Ответ на: комментарий от Deleted

>А почему вы отвечаете вопросом на вопрос? Вы таки антисемит?

Да.

1. сайтов на свете больше одного.

2. пользователи открывают не только один сайт за раз.
3. обрабатывать этот шмоток яваскрипта всё равно нужно даже в пределах одного сайта.

Ну, значит, обработается столько раз, сколько нужно. Это не «шмоток яваскрипта», а обычная библиотечка. Ничего страшного обрабатываемого в ней нет.
Да и вообще - больше 17% пользователей до сих пор используют firefox, а ты говоришь о какой-то оптимизации яваскрипта.

Zhid
()
Ответ на: комментарий от Zhid

> Поскольку в JS все массивы - хэши, «аргумент» не катит.

facepalm.js

Ты уж определись. Чем работа с массивом, как с объектом лучше, чем работа с массивом, как хэшем?

массив это массив. объект это хэш.

Мною особых проблем при открытии сайтов с jQuery не было. Сайты с jQuery, Prototype,

обнаружена ошибка в логике.

Советую засечь, как будет отличасть скорость выполнения хотя бы $(".somesel") и функции, выбирающей из DOM все элементы с классом somesel (кроссбраузерной).

ок, днём проверю /ставлю на дом, хотя скорее отличие будет незначительно/

qnikst ★★★★★
()
Ответ на: комментарий от Zhid

>Это не «шмоток яваскрипта», а обычная библиотечка

Шикарно :}

Deleted
()
Ответ на: комментарий от qnikst

>массив это массив. объект это хэш.

Проверяем.
var array = new Array() //Создается объект встроенного класса «массив»
array[some] = «something»
alert(array.some) //Выведет «something

Where is your god now?

обнаружена ошибка в логике.


Попробуй дочитывать предложения до конца.

ок, днём проверю /ставлю на дом, хотя скорее отличие будет незначительно/


Да jQuery тоже вроде только с DOM работает, а можно как-то еще?

Zhid
()
Ответ на: комментарий от Zhid

выведет:

 ReferenceError: some is not defined {  message="some is not defined",  more...}

ну, допустим имелось ввижу a['some']; Кстати такое поведение нужно списывать на особенности javascript

var a=[];
alert( a instanceof Array);
a['some']="smth";
alert(a.length);

Oh shit...

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>ну, допустим имелось ввижу a['some'];
Да, конечно, a[some] - это привычка от PHP.

Кстати такое поведение нужно списывать на особенности javascript


Это не его особенности, а его логика. В нем нет функций, переменных или объектов - только хэши, причем запись вида object.property является вызовом значения по ключу property в хэше object.

Oh shit...


А тут нечего удивляться, length - это примитивный метод, который просто перебирает все свойства массива (может быть, даже for in), а затем выводит наибольший числовой индекс + 1.

Zhid
()
Ответ на: комментарий от Zhid

typeof подсказывает, что length это не метод.

В нем нет функций, переменных или объектов - только хэши,

в этом предложении написана чушь.

наверно ты хотел сказать логичную вещь, что все объекты это хэши (не совсем хорошее устверждение, но допустим ладно, ясно что ты имеешь ввиду), а массив это объект, следовательно это хэш. Но видать не получилось :) Хотя размышления вполне логичные и не лишённые смысла.

var timeBefore = new Date();

var a = [];
for (var i=0;i<99999;i++){
  a.push(i+1);
}

var test=0;
for (var i in a){ // for (var i=0;i<99999;i++){
  test += 1/Math.sqrt(a[i]*a[i]*a[i]+1);
}
var timeAfter = new Date();
var workTime = timeAfter.getTime() - timeBefore.getTime();
alert("" + workTime + "мс");
alert(""+test);

290/330 в пользу for i, интересно обратить внимание на относительную разницу

qnikst ★★★★★
()
Ответ на: комментарий от qnikst

>в этом предложении написана чушь.

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


Мне что-то вспомнилось начало «Пасынков вселенной» Хайнлайна. Тот момент, где молодой говорит сказителю, что может быть, все эти книги, учебники физики и другие - описание реальных вещей, а сказитель объясняет, что это метафоры, которыми предками описывали философию и человеческие взаимоотношения.

Вот примерно такая же ситуация.
Объясняю. Я не хотел сказать, что «объекты - хэши» вообще. Я сказал, что в JS абсолютно все реализовано через хэши. Например, функция - это совокупность хэшей, где в одном хранятся команды, в другом - переменные функции, итд. Благодаря этому функции можно присваивать свойствам других хэшей, в результате чего появляются методы (и объекты).

290/330 в пользу for i

Ну и стоило так волноваться из-за каких-то 40 мс?

Zhid
()
Ответ на: комментарий от Zhid

Во-первых http://en.wikipedia.org/wiki/Hash оттуда близкими являются 3 определения

# Hash table, a data structure associating keys with values using a hash function

# Associative array, an abstract data type often implemented as a hash table

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

Например, функция - это совокупность хэшей, где в одном хранятся команды, в другом - переменные функции, итд

что-то подсказывает мне, что функция в js это строка (набор строк), который будет обработан js движком при вызове, в результате чего выполнение функция может зависеть от контекста в котором она выполняется.

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

переход про благодаря этому не понятен. поясни, почему функциям надо быть «хэшами» чтобы было возможно присвоение их свойствам хэшэй(?!). Кстати, что такое свойство хэша?

Ну и стоило так волноваться из-за каких-то 40 мс?

ты хотел написать 13% ?

qnikst ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.