2015-06-19 10 views
6

Mam ciąg z unikalnymi numerami przestrzeni rozdzielone w następujący sposób:Przełącznik liczby w ciąg

"2 4 13 14 28 33" 

Potrzebujesz szybki i skuteczny sposób, aby przełączyć parę z nich w postaci:

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

I mógł podzielić ciąg i wyszukać wartości, ale to brzmi nudno. Masz lepszy pomysł?

+3

Co dotychczas próbowałeś rozwiązać problem? Czy zrobiłeś jakieś badania? Czy masz problem z bieżącym kodem? – Anonymous

+4

Jestem nudny, co jest nie tak z nudnym! –

+2

"ale to brzmi nudno" - możesz chcieć wyjaśnić, w jaki sposób oceniasz emocje, abyśmy wiedzieli, gdzie przesłać odpowiedzi ...Albo bardziej poważnie, że ta metoda jest tą, na którą chciałbym pójść, to zadziałałoby i na przykład, który dałeś, nawet nie ssał tak dużo. Co z tą metodą, której nie lubisz (zakładam, że "nudne" było po prostu żartobliwe). – Chris

Odpowiedz

8

Spróbuj również:

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"

Uwaga: Nie używaj switch jako nazwa funkcji, switch jest stwierdzeniem dla JavaScript.

+0

@skobaljic "Cool" nie oznacza "najbardziej efektywny" ;-) – leaf

+0

To odpowiada na pytanie 100%, jest to najlepszy sposób na zamianę unikatowych liczb w łańcuchu. Dzięki! – skobaljic

+0

@skobaljic Mam na myśli, chłód nie jest wiarygodnym kryterium ;-) – leaf

10

Możesz skorzystać z funkcji array zamiast strings.

zobaczyć komentarze inline w kodzie:

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

Myślę, że najlepszym rozwiązaniem może być użycie natywnego zastąpić metodą Javascript dla ciągów.

W3Schools ma ładne nisko na nim here. Powinien wykonać dokładnie to, co chcesz, ale może zastąpić WSZYSTKIE podane liczby, więc pamiętaj, aby powiedzieć coś takiego, jak: var replacement = str.replace("2 ", "28 ");

EDYCJA: Wskazuje na dobrą wadę. Zamiast tego możesz spróbować:

EDIT2: Opps, miał kilka błędów w oryginalnym kodzie. Testowane i działa dobrze! :)

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

Odgadnij najpierw ciąg znaków za pomocą spacji, zamiast użyć "2" i "28" (ponieważ 28 może być na końcu, a "2" również pasuje do "12"? – skobaljic

+0

Dobrze, poprawiłem moją odpowiedź –

+0

To nadal nie działa - [Fiddle] (https://jsfiddle.net/eq77ykdL/) – skobaljic

1

Coś takiego powinno działać.

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

no tak, ale pracowałem na własnym skrzypiec tutaj https://jsfiddle.net/kfhz9bkq/ :) –

+0

Nie ma sensu zamieszczać tej samej odpowiedzi, bez względu na to, czy masz własne skrzypce albo nie. –

5

nie mogę ocenić, czy jest to nudny lub nie, ale przynajmniej nie jest to podział i zapętlenie :)

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

Jestem pewien, że to nie jest najlepszy sposób. , ale działa ..

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

Kredyt: http://stackoverflow.com/a/30941604/1636522 :-D – leaf

Powiązane problemy