2015-06-19 2 views
6

У меня есть строка с разделенными пробелами уникальных чисел следующим образом:число переключателей в строке

"2 4 13 14 28 33" 

Нужен быстрым и эффективным способом переключения пары из них в форме:

switchNumbers(2, 28) 
// result: "28 4 13 14 2 33" 

I может разбить строку и найти значения, но это звучит скучно. Любая лучшая идея?

+3

Что вы пробовали сделать до сих пор, чтобы решить эту проблему? Проводили ли вы какие-либо исследования? У вас есть проблема в вашем текущем коде? – Anonymous

+4

Мне скучно, что случилось с скукой! –

+2

«но это звучит скучно» - вы можете уточнить, как вы оцениваете волнение, чтобы мы знали, где передать ответы ...Или, что более серьезно, этот метод - тот, на который я бы пошел, это сработало бы, и для примера, который вы дали, даже не сосать. Как насчет этого метода вам не нравится (я предполагаю, что «скучно» было просто грандиозным). – Chris

ответ

8

Попробуйте также:

var numbers = "2 4 13 14 28 33"; 
 

 
function switchNum(from, to){ 
 
    return numbers.replace(/\d+/g, function(num){ 
 
    return num == from ? to : num == to ? from : num 
 
    }) 
 
} 
 

 
alert(switchNum(2, 28)) //result: "28 4 13 14 2 33"

Примечание: Не используйте switch в качестве имени функции, switch - это заявление для JavaScript.

+0

@skobaljic «Прохладный» не означает «самый эффективный» ;-) – leaf

+0

Это отвечает на вопрос 100%, это лучший способ переключить уникальные числа в строке. Спасибо чувак! – skobaljic

+0

@skobaljic Я имею в виду, прохлада не является надежным критерием ;-) – leaf

10

Вы можете воспользоваться функциями array вместо strings.

Смотреть комментарии встроенный в коде:

var str = "2 4 13 14 28 33"; 

// Don't use `switch` as name 
function switchNumbers(a, b) { 
    var arr = str.split(' '); 
    // Convert string to array 

    // Get the index of both the elements 
    var firstIndex = arr.indexOf(a.toString()); 
    var secondIndex = arr.indexOf(b.toString()); 


    // Change the position of both elements 
    arr[firstIndex] = b; 
    arr[secondIndex] = a; 


    // Return swapped string 
    return arr.join(' '); 
} 


alert(switchNumbers(2, 28)); 

DEMO

1

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

W3Schools имеет приятное понижение на нем here. Он должен делать именно то, что вы хотите, но может заменить ВСЕ числа, которые вы указали, поэтому обязательно скажите что-то вроде var replacement = str.replace("2 ", "28 ");

EDIT: Указанный хороший недостаток с этим. Вместо этого вы могли бы попробовать:

EDIT2: Opps, имел некоторые недостатки в исходном коде. Протестировано и отлично работает! :)

function replaceNumbers(x1, x2, str) { 
 
     var strMod = " " + str + " " 
 
     var x1Mod = " " + x1 + " " 
 
     var x2Mod = " " + x2 + " " 
 
     
 
     // Want to replace "farthest" first to ensure correct replacement. 
 
     if (str.indexOf(x1Mod) > str.indexOf(x2Mod)) { 
 
      strMod = strMod.replace(x1Mod, x2Mod) 
 
      strMod = strMod.replace(x2Mod, x1Mod) 
 
     } else { 
 
      strMod = strMod.replace(x2Mod, x1Mod) 
 
      strMod = strMod.replace(x1Mod, x2Mod) 
 
     } 
 
     
 
     return strMod.slice(1, strMod.length - 1) 
 
    } 
 

 
    var numbers = "2 4 13 14 28 33"; 
 
    alert(replaceNumbers(2, 33, numbers))

+1

Угадай, что нужно было бы перенести строку сначала пробелом, чем использовать «2» и «28» (потому что 28 может быть на конце, чем «2» также будет соответствовать «12»? – skobaljic

+0

Хорошо, я отредактировал свой ответ –

+0

Он по-прежнему не работает - [Fiddle] (https://jsfiddle.net/eq77ykdL/) – skobaljic

1

Нечто подобное должно работать.

var str= "2 4 13 14 28 33"; 
function switchNumbers(a, b) { 
    var arr = str.split(" "); 
    var first= arr.indexOf(a), second = arr.indexOf(b); 
    arr[first] = arr.splice(second, 1, arr[first])[0]; 
    return arr.join(" "); 
} 

Jsfiddle demo

1
var str = "2 4 13 14 28 33"; 
switchNumbers(2,28); // call 
function switchNumbers(a,b) 
{ 


var split_ = str.split(" "); 

var index_of_1 = split_.indexOf(a+""); 
var index_of_2 = split_.indexOf(b+"") 

temp = split_[index_of_1]; 
split_[index_of_1] = split_[index_of_2] ; 
split_[index_of_2] = temp ; 


split_.toString(" "); // Answer 
} 
+0

ну да, но я работал над своей скрипкой здесь https://jsfiddle.net/kfhz9bkq/ :) –

+0

Нет смысла публиковать тот же ответ, хотя, независимо от того, у вас есть своя скрипка или нет. –

5

Я не могу судить, если это скучный или нет, но по крайней мере это не разделение и перекручивание :)

function switchNumbers(str, x, y) { 
 
    var regexp = new RegExp('\\b(' + x + '|' + y + ')\\b', 'g'); // /\b(x|y)\b/g 
 
    return str.replace(regexp, function(match) { return match == x ? y : x; }); 
 
} 
 

 
var s = "2 4 13 14 28 33"; 
 

 
document.write('<pre>' + switchNumbers(s, 2, 28) + '</pre>');

2

Я уверен, что это не самый лучший способ. но это работает.

var swapnums = function(x,first,second) { 
    var y = x.split(" "); 
    var locOfFirst = y.indexOf(first.toString()); 
    var locOfSecond = y.indexOf(second.toString()); 
    y[locOfFirst] = second.toString(); 
    y[locOfSecond] = first.toString(); 
    return y.join(" "); 
}; 
+0

Кредит: http://stackoverflow.com/a/30941604/1636522 :-D – leaf

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