2013-06-13 2 views
0

У меня есть две строки: «a» и «b». Как получить «b» от «a». И «a» от «b» без , если? Нравится:получение противоположного значения javascript

var arr = ["a", "b"]; 

function reverse(str){ 
    return arr[+!arr.indexOf(str)]; 
} 

но более элегантным способом.

+2

Что вы подразумеваете под «b», получающим «a» и «a» получение «b»? – j08691

+2

'return str == 'a'? 'b': 'a'; 'более читабельна, чем у вас сейчас. Зачем вам это нужно? – Blender

+2

OP сказал без ** тернарных ** или если еще – Gabe

ответ

4

Много, много способов сделать это.

var a = 'foo', b = 'bar', 
    arr = [a, b]; 

// dictionary object 
var o = {}; 
o[a] = b; 
o[b] = a; 

function reverse(x) { 
    return o[x]; 
} 

// equality with cast (+x or x|0) 
function reverse(x) { 
    return arr[+(x === a)]; 
} 
// or 
function reverse(x) { 
    return arr[+(x === arr[0])]; 
} 

Если вы просто хотите, чтобы по очереди между этими двумя, вы могли бы написать генератор

var reverse = (function() { 
    var i = 1; 
    return function() { 
     return arr[i = 1 - i]; 
    } 
}()); 
reverse(); // "foo" 
reverse(); // "bar" 
reverse(); // "foo" 
+0

Я не думаю, что это работает. '['a', 'b'] [true]' 'undefined'. –

+0

@Blender yes, fixed –

+0

@Paul S. Вопрос, в коде генератора, я предполагаю, что анонимная функция хранится в «обратном обратном направлении», но где была переменная «var i»? Как получилось, что это не сбор мусора? , выглядит как черная магия для меня ... – Ziul

2

Вы могли бы сделать

return arr[(str=='a')%2] 

или если вы не хотите, чтобы жёстко 'а'

return arr[(str==arr[0])%2] 

или (используя ту же самую идею)

return arr[+(str==arr[0])] 

Это выглядит незначительно чем ваше решение, но как это лучше, чем использование тернарного оператора?

1

Используйте modulo operator.

var arr = ["a", "b"]; 

function reverse(str){ 
    return arr[(arr.indexOf(str) + 1) % 2]; 
} 
1

Вы можете использовать символ/преобразование ASCII:

function reverse(c) { 
    return String.fromCharCode(195 - c.charCodeAt(0)) 
} 

Попробуй

alert(reverse('a')); 
    alert(reverse('b')); 
+1

+1, это отличный пример для точных строк '' '' и ''b" '. Однако действительно нужно использовать 'console.log'. –

Смежные вопросы