Противоположные значения

Avenus

Under Glory Yield
Противоположные значения

Привет, всем! :)

В теории:
PHP:
var t={0:x1,1:x2};
var c=condition?0:1; // condition - условие
alert(t.c+' != '+!t.c); // херня
Как можно получить в alert 2 противоположных значения для t?

-~{}~ 26.12.09 20:00:

Пока повсеместно использую такие выражения:
PHP:
var x1=condition?1:0; 
var x2=(x1===1)?0:1;
Но, условия и значения бывают такими, что кода получается слишком много :)
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
дай техническую трактовку понятия "противоположное значение"
 

Avenus

Under Glory Yield
grigori, возможно я неверно трактую, но в данном случае хотелось бы получить инвертирование значения: 1 и 0.
 

Mols

Новичок
если я всё правильно понял, то надо что-то типа такого?
PHP:
var t={0:'x1',1:'x2'};
var c=true?0:1; // condition 
alert(t[c?1:0]+' != '+t[c?0:1]);
Только на очень понятно зачем? Чтобі порядок менялся в зависимости от условия?
 

Avenus

Under Glory Yield
Mols, да... типа этого :)
На примере 0 и 1 это нормально выглядит.
...
Не могу придумать или найти реализацию:
К примеру:
Как указать значения 'С'=1 и Не 'С'=0
И потом получить 'C' и Не 'С'?
Что, кроме обычной двойной проверки ничего из решений нет?
 

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
так что ли?

var t={0:'x1',1:'x2'};
c = condition ? 0 : 1;
alert(t[c] + ' != ' + t[1-c]);


можно даже так

var t={0:'x1',1:'x2'};
alert(t[1-condition] + ' != ' + t[+condition]);
 

dimagolov

Новичок
:)
это же JS, где все что угодно это объект, любые ф-ии могут создавать объекты, а свойства объектов можно менять на лету :)
PHP:
var condition= function () {
   return (this[0] == 'x1' && this[1] == 'x2');
}
var t={0:'x1',1:'x2', c : condition};

alert(t.c()+' != '+!t.c());
 

Avenus

Under Glory Yield
dimagolov, изящно!
Спасибо! ;)

Нужен, своего рода, переключатель вкл./выкл.
...
Ты в condition=function(){ используешь известные значения x1 и x2.
Вот, как бы от них нужно уйти :)

-~{}~ 28.12.09 19:39:

В общем, напишу конкретную задачу, чтобы не путать никого, да и самому не путаться:

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

- на странице множество изображений "+" и "-"
- в переменных предопределены src для смены "+" на "-"
- в скрипте для объекта изображения в src проверяется совпадение с определенными srс для смены "+" на "-"
- если совпадение есть, то в src значение заменяется на противоположное

PHP:
...
options.plusImage='plus.gif';
options.minusImage='minus.gif';
...
var img=$(this).attr('src');
var c1=(img.indexOf(options.plusImage)>=0)
? options.plusImage
: options.minusImage;
var c2=(c1===options.plusImage)
? options.minusImage
: options.plusImage;
$(this).attr('src',img.replace(c1,c2));
Хотелось упростить задачу проверки условия и писать что-то
типа этого:
PHP:
var c=(img.indexOf(options.plusImage)>=0)
? options.minusImage
: options.plusImage;
$(this).attr('src',img.replace(c,!c));
Чтобы по условию можно было получить противоположные значения для с.
Написал пост в форум потому как подумал, что может есть
такое решение или даже функция в javascript, а я пытаюсь написать "велосипед" :)
 

dimagolov

Новичок
PHP:
function switchImage (oImg) {
	oI.src= oI.isPlus ? 'minus.gif' : 'plus.gif';
	oI.isPlus= !oI.isPlus;
}
function switchImageEvent (event) {
	var oI= event.srcElement || event.target;
	switchImage(oI);
	... // do something smart
}
function initPlusMinus (oImg) {
	switchImage(oImg);
	addHandler(oImg, 'onclick', switchImage);
}
 

Avenus

Under Glory Yield
dimagolov, что-то ты намудрил :)
В первый раз ты отличное решение предложил!
Вот, сделал после твоей подсказки:
PHP:
var c=(img.indexOf(options.plusImage)>=0) ? true : false;
var t={'true' : options.plusImage,'false' : options.minusImage};
$(this).attr('src', img.replace(t[c], t[!c]));
-~{}~ 28.12.09 20:41:

Теперь можно этот метод использовать для любых условий, которые не нужно по 2 раза проверять :)
Хотя может это и херня вообще...
 

dimagolov

Новичок
Avenus, что же я намудрил? я свойство картинкам цепляю isPlus и по нему выбираю ф-ей switchImage нужный src, попутно меняя значение isPlus на обратное. тут еще трюк в том, что если isPlus не устанавливалось, то oI.isPlus имеет значение undefined, что для логических операций эквивалентно false.

введи дополнительное свойство, а не мудри с indexOf, а то поменяешь имя картинке и логика поменяется.
 

Avenus

Under Glory Yield
dimagolov, извиняюсь... ты onclick чисто для теста привязал.
не мудри с indexOf, а то поменяешь имя картинке и логика поменяется
В каком смысле? :)
Я же имя изображения задаю в options.
 

dimagolov

Новичок
Avenus, блин, ты вообще себе представляешь, как соотносится объем вычислений про if(src.indexOf()>=0) и if(src.isPlus)? ты же извращенным образом строку в src используешь как битовый флаг. и операция у тебя бинарная - отрицание.
 

Avenus

Under Glory Yield
dimagolov, и правда, а я и не подумал об этом ;)

-~{}~ 29.12.09 21:39:

Только, что моё, что твоё предложение, опять же, подходят к конкретному случаю...
А как же быть с различными условиями?
Т.е. отдельной функции, которой передаются 2 параметра и условие, а возвращается значение и НЕ значение.

К примеру:
PHP:
function toggle(a){
 if(a.c) return a.x1;
 else return a.x2;
}
var c=toggle({'x1' : 1, 'x2' : 0, 'c' : (1>0)});
alert(c+' != ' +!c); // просто пример
-~{}~ 29.12.09 21:56:

Что-то я все больше убеждаюсь, что нихрена не понимаю в javascript :)
 

dimagolov

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

-~{}~ 29.12.09 15:16:

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

Avenus

Under Glory Yield
Да. Вот, ты, к примеру, написал 3 функции:
PHP:
function switchImage(oImg){...} 
function switchImageEvent(event){...} 
function initPlusMinus(oImg){...}
Теперь необходимо получить противоположные значения НЕ для изображений. Условие похлеще будет и подлиннее, но возвращает условие тоже самое true или false.

И мне опять возвращаться к обычной двойной проверке?
PHP:
var result=(...условие...) ? true : false;
x=result ? N1 : N2;
not_x=!result ? N2 : N1;
Далее оба значения x и not_x используются по назначению, но это уже неважно :)

-~{}~ 29.12.09 22:23:

Не лучше ли будет написать одну функцию, которая возвращает
C и !С для заданных значений и условия?

-~{}~ 29.12.09 22:24:

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

Mols

Новичок
От тип....
В описываемой задаче у Вас есть одно значение х или нот_х и набор в котором соответсвенно находится эта пара. И единственное, что надо - это получить "другое" значение из набора. Всё это свести элементарному массиву вида.
a[0] = val1; a[1] = val2.
И имея этот набор и одно из значений (х) получение нот_х будет следующим
нот_х = a[0] == Х ? a[1]:a[0];

Что ещё надо?
 

Avenus

Under Glory Yield
Mols, а где условие? :)

Если не смотреть на задачу с изображениями (зря я ее написал), только с толку сбил.

У меня условие: не проверка совпадения с одним из значений в наборе, а возврат одного из значений при выполнении условия или нет.

Уже же несколько раз писал:
PHP:
условие=true -> одно значение
условие=false -> другое значение
Вот, что пришло в голову пока...
PHP:
function toggle(obj,condition){ 
 if(condition) return obj.x1;
 else return obj.x2;
} 
var t={ 'x1' : 1, 'x2' : 0, 'c' : (1>0) };
alert(toggle(t, t.c) + ' != ' + toggle(t, !t.c));
Мне очень важно: не писать по 2 раза проверку условия.

-~{}~ 29.12.09 22:56:

Применительно к одной из задач (с изображениями):
PHP:
var img=$(this).attr('src');
var t={
'x1' : options.plusImage,
'x2' : options.minusImage,
'c' : (img.indexOf(options.plusImage)>=0)
};
$(this).attr('src',img.replace(toggle(t,t.c),toggle(t,!t.c)));
dimagolov, пока отброшу замечания по поводу indexOf :)
Буду теперь это изменять...
 

Mols

Новичок
ИМХО Вы "хотите странное".
dimagolov Вам показал вполне удобное, легко читаемое решение для конкретной задачи. Думаю, что для другой конкретной задачи тоже легко найдется нормальное, удобное решение. А пока это всё выглядит как "пойди туда, не знаю куда, найди то, не знаю что"
 

dimagolov

Новичок
проверка условия это предикат. аналог предиката это ф-я, возвращающая булевое значание, или просто булевая переменная. что еще непонятно?

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