Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Как сравнить массив с переменной в цикле? (https://javascript.ru/forum/misc/46482-kak-sravnit-massiv-s-peremennojj-v-cikle.html)

light 11.04.2014 14:53

Как сравнить массив с переменной в цикле?
 
Есть вот такой код, где нужно заменить вот это условие i==80 || i==64 || i==16
for (i = 100; i >= 1; i--) {  
			if (i==80 || i==64 || i==16) {
				действие
			} else {
				другое действие
			}
		}

Я решил сделать массив с нужными числами, и сравнивать их с i, но не знаю как это сделать.
Подскажите пожалуйста.
Или может быть есть другой способ?

Octane 11.04.2014 15:01

var specialValues = [16, 64, 80];

for (i = 100; i >= 1; i--) {  
	if (specialValues.indexOf(i) != -1) {
		действие
	} else {
		другое действие
	}
}

barkar 11.04.2014 15:02

Зачем перебирать все значения массива если вам нужно 80, 64, 16, вот их и сравнивайте, это если вам нужно именно значения массива с определенными индексами, в вашем случае я так понимаю это 80 64 16, зачем гонять весь массив.

Если у вас несколько значений а цикл в 100 итераций цикл не целесообразен!

for (i = 100; i >= 1; --i)

Так производительней.

light 11.04.2014 15:16

Octane,
Спасибо большое!) работает.
Но теперь другой вопрос, как из json данных получить массив?
Ответ приходит в таком виде "test": "16,64,80"
Я думал, что вставлю вот так и оно сработает, но в итоге ничего не получилось:
...
		success: function(demo){    
		var specialValues = [demo.active];
...

light 11.04.2014 15:16

barkar,
Нет, не совсем это упрощенный пример, на деле таких цифр несколько сотен, которые я получаю через Ajax

ksa 11.04.2014 15:17

Цитата:

Сообщение от light
заменить вот это условие i==80 || i==64 || i==16

Как вариант...

for (i = 100; i >= 1; i--) {  
	switch i {
		case 16: case 64: case 80:
			// действия
			break;
		default:
			// другие действия
	};
};

Или так
var o = {16: true, 64: true, 80: true];

for (i = 100; i >= 1; i--) {  
	if (o[i]) {
		//действие
	} else {
		//другое действие
	};
};

barkar 11.04.2014 15:27

Ответ приходит в таком виде "test": "16,64,80"

А пишите
var specialValues = [demo.active];
success: function(demo){
console.log(demo);
var specialValues = demo.test.split(',');

Sweet 11.04.2014 15:33

Лучше через объект делать - быстрее. Объект сделать можно например так:
var json = JSON.parse('{"test": "16,64,80"}');

var object = json.test.split(/\s*,\s*/).reduce(function (object, x) {
    object[x] = true;
    return object;
}, {});

light 11.04.2014 15:39

barkar,
Спасибо) Массив получился, только теперь код не срабатывает)
Раньше он был вида var specialValues = [16, 64, 80];
А теперь var specialValues = ["16", "64", "80"]; и соответственно ничего не выводит.

light 11.04.2014 15:40

Sweet,
Сложно как то) не знаю как к себе это пока применить, но ваш совет запомню, спасибо)

ksa 11.04.2014 15:46

Цитата:

Сообщение от light
Ответ приходит в таком виде "test": "16,64,80"

Так переделай на такой

"test": [16,64,80]

ksa 11.04.2014 15:47

Или используй так

specialValues.indexOf(''+i)

Sweet 11.04.2014 15:51

Цитата:

Сообщение от ksa
Или используй так

specialValues.indexOf(''+i)

А зачем к пустой строке прибавлять, если и так работает? Или я чего не учитываю?
alert( "16,64,80".indexOf(64) );

light 11.04.2014 15:54

ksa,
Спасибо! Это то что нужно)
P.s. что бы не создавать новую тему, есть глупый вопрос)

У меня есть скрипт стороннего сайта, но нужен он не всегда, а только когда кликают по блоку.
<script src="//ulogin.ru/js/ulogin.js"></script>
Возможно ли его загружать, только при клике, а не всегда? Т.е. примерно вот так:
$('#auth').click(function(){
<script src="//ulogin.ru/js/ulogin.js"></script> 
});

Sweet 11.04.2014 15:55

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

ksa 11.04.2014 15:56

Цитата:

Сообщение от Sweet
А зачем к пустой строке прибавлять, если и так работает?

ТС написал выше - де перестало работать, если в массиве строки вместо цифр... Отсюда и совет такой - сделать строку... :)

ksa 11.04.2014 15:57

Бивас, тест! (c)

alert( ["16","64","80"].indexOf(64) );

Не находит...
alert( ["16","64","80"].indexOf(''+64) );

Находит...

light 11.04.2014 15:58

Sweet,
Кстати да) и правда работает)
if (demo.test.indexOf(i) != -1) {
  var active = "active";
} else {
   var active = "";
}

ksa 11.04.2014 16:02

Цитата:

Сообщение от light
Возможно ли его загружать, только при клике, а не всегда? Т.е. примерно вот так:
$('#auth').click(function(){
   <script src="//ulogin.ru/js/ulogin.js"></script> 
});

Мочь-то можно. Но только не так. :D
Вот темка была...
http://javascript.ru/forum/css-html-...avascript.html
И нужно учитывать, что сразу он так же не появится. Ему ведь еще подгрузиться нужно...


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