2015-06-19 12 views
6

Tôi có một chuỗi với con số duy nhất không gian tách ra như sau:số chuyển mạch trong chuỗi

"2 4 13 14 28 33" 

Cần một cách nhanh chóng và hiệu quả để chuyển đổi một cặp trong số họ dưới hình thức:

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

tôi có thể chia chuỗi và tìm kiếm các giá trị, nhưng điều đó nghe có vẻ nhàm chán. Có ý tưởng nào tốt hơn không?

+3

Bạn đã thử gì cho đến nay để giải quyết vấn đề? Bạn đã thực hiện bất kỳ nghiên cứu nào chưa? Bạn có gặp sự cố trong mã hiện tại của mình không? – Anonymous

+4

Tôi nhàm chán, có gì sai với nhàm chán! –

+2

"nhưng điều đó nghe có vẻ nhàm chán" - bạn có thể muốn làm rõ cách bạn đánh giá sự phấn khích để chúng tôi biết nơi để đưa ra câu trả lời ...Hoặc nghiêm túc hơn là phương pháp mà tôi muốn, nó sẽ hoạt động và ví dụ bạn đã đưa ra thậm chí sẽ không hút nhiều. Điều gì về phương pháp mà bạn không thích (Tôi giả sử "nhàm chán" chỉ là facetious). – Chris

Trả lời

8

Hãy thử thêm:

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"

Note: Không sử dụng switch như tên hàm, switch là một câu lệnh cho JavaScript.

+0

@skobaljic "Cool" không có nghĩa là "hiệu quả nhất" ;-) – leaf

+0

Điều này trả lời câu hỏi 100%, đây là cách tốt nhất để chuyển đổi số duy nhất trong chuỗi. Cảm ơn người đàn ông! – skobaljic

+0

@skobaljic Ý tôi là, độ lạnh không phải là tiêu chí đáng tin cậy ;-) – leaf

10

Bạn có thể tận dụng các chức năng array thay vì strings.

Xem ý kiến ​​inline trong mã:

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

Tôi nghĩ rằng giải pháp tốt nhất của bạn có thể sử dụng phương pháp tự nhiên thay thế JavaScript cho chuỗi.

W3Trường có độ phân giải thấp trên đó here. Nó nên làm chính xác những gì bạn muốn, nhưng có thể thay thế TẤT CẢ những con số bạn chỉ định, vì vậy hãy chắc chắn để nói điều gì đó như var replacement = str.replace("2 ", "28 ");

EDIT: Chỉ ra một lỗ hổng tốt với điều này. Thay vào đó bạn có thể thử:

EDIT2: Opp, có một số sai sót trong mã ban đầu. Thử nghiệm và hoạt động tốt! :)

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

Đoán sẽ phải quấn chuỗi đầu tiên với không gian, hơn là sử dụng "2" và "28" (vì 28 có thể ở cuối, hơn "2" cũng sẽ khớp từ "12"? – skobaljic

+0

Điểm tốt! Tôi đã chỉnh sửa câu trả lời của mình –

+0

Nó vẫn không hoạt động - [Fiddle] (https://jsfiddle.net/eq77ykdL/) – skobaljic

1

Something như thế nên làm việc.

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

cũng có, Nhưng tôi đã làm việc trên fiddle của riêng tôi ở đây https://jsfiddle.net/kfhz9bkq/ :) –

+0

Không có điểm trong việc đăng câu trả lời tương tự mặc dù, không có vấn đề bạn có fiddle của riêng bạn hay không. –

5

tôi không thể đánh giá nếu điều này là nhàm chán hay không nhưng ít nhất nó không phải là tách và Looping :)

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

Tôi chắc chắn đây không phải là cách tốt nhất. nhưng nó hoạt động ..

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

Tín dụng: http://stackoverflow.com/a/30941604/1636522 :-D – leaf

Các vấn đề liên quan