javascript какой из вариантов выбрать?

kill-still

подскажите, кто хорошо разбирается, что предпочтительнее?
вариант 1:

for (var i in searchRes.hits.hits) {
if (searchRes.hits.hits[i]._source.name.lang.rus == childName)
childID = searchRes.hits.hits[i]._id;
};

вариант 2:

searchRes.hits.hits.map( function(hit) {
if (hit._source.name.lang.rus == childName)
childID = hit._id;
});

Ivan826

Ты чего добиться вообще хочешь?
Ты перебираешь массив и в случае единичного совпадения значения с определённым устанавливаешь значение а переменную?
Если я тебя правильно понял, то только for - for это просто цикл, а map создаёт ещё один массив со значениями из результатов вызова callback

IvladV71

что такое searchRes.hits.hits? Если массив, то первый вариант будет работать медленно, а второй не совсем корректен. В таком случае надо либо использовать searchRes.hits.hits.forEach, либо

for (var i = searchRes.hits.hits.length; i--; ) {
var hit = searchRes.hits.hits[i];
if (hit._source.name.lang.rus === childName) {
childID = searchRes.hits.hits[i]._id;
break;
}
}

В противном случае второй вариант, скорее всего, ошибочен, а в первом лучше добавить проверку на searchRes.hits.hits[i] !== undefined

kill-still

да, searchRes это жсон, а searchRes.hits.hits это массив.
не знаю, корректен, или нет, но оба одинаковый результат дают.
З.Ы. из forEach можно выйти break-ом? (я в метро уже, не могу проверить)?
З.З.Ы. а что конкретно делает "for(var i in searchRes.hits.hits)"?

kill-still

p/s посмотрел исходники Array.prototype.map, действительно хуйню какую-то состряпал
(я так понял просто второй ломает searchRes.hits.hits т.к. не возвращает ничего)

Maurog

что предпочтительнее?
на функциональщине map идет в топку (он как бы для других сценариев) и на сцену выходит filter
http://stackoverflow.com/questions/3241881/jquery-index-of-e...
яваскриптом не владею :o

kill-still

а этот вариант чем-то отличается от "вариант 1" ?

apl13

на функциональщине map идет в топку (он как бы для других сценариев)
Ч0ч0? :o

PooH

Ч0ч0?
это же сротишка - он лучше всех знает
тут лучше всего выглядит filter (с точки зрения правильности)
правда, какой-нибудь цикл может и побыстрее работать

kill-still

если такой умный, то скажи, почему не работает

var iter = function (arr, callback) {
var len = arr.length;
for (var i = 0; i < len; i++) {
callback(arr[i]);
};

var val;
if (ISARRAY == 1) {
var values = VALUE.split(',');
val = [];
/*
if (%some condition%)
iter(values, function (x) {
values.push(x.match(/\d+/)[0])
})
else
*/
iter(values, val.push);
} else
val = VALUE;

PooH

var iter = function (arr, callback) {
  var len = arr.length;
  for (var i = 0; i < len; i++) {
    callback(arr[i]);
};
var val;
if (ISARRAY == 1) {
  var values = VALUE.split(',');
  val = [];
/*
  if (%some condition%)
    iter(values, function (x) {
     values.push(x.match(/\d+/)[0])
    })
  else
*/
    iter(values, val.push);
} else
  val = VALUE;
потому что фигурную скобку забыл
а по делу ты передаешь val.push в качестве callback, ?указатель? указывает на функцию Array.prototype.push
в коде функции ты вызываешь push в глобальном контексте
т.е. работает, но не так как ты ожидал
все эти значения добавятся в window
PS код говно и выглядит как говно
нельзя что-нить типа
 
 
var vals = VALUE.split(',').map(function(e, i, a) {
if(var res = /\d+/i.exec(e
return res[0];
else
return e;
});

было сделать?

kill-still

скобку я случайно удалил когда на форум постил.
в некоторых других языках метод объекта - это два указателя: на тело с инструкциями и на this.
Оставить комментарий
Имя или ник:
Комментарий: