2009-08-20 45 views
12

Tôi có chuỗi csv như thế này "1,2,3" và muốn có thể xóa giá trị mong muốn khỏi chuỗi đó.xóa giá trị khỏi các giá trị được phân cách bằng dấu phẩy chuỗi

Ví dụ nếu tôi muốn loại bỏ các giá trị: 2, chuỗi đầu ra nên là như sau:

"1,3"

Tôi đang sử dụng đoạn mã sau nhưng có vẻ là không hiệu quả.

var values = selectedvalues.split(","); 
      if (values.length > 0) { 
       for (var i = 0; i < values.length; i++) { 
        if (values[i] == value) { 
         index = i; 
         break; 
        } 
       } 
       if (index != -1) { 
        selectedvalues = selectedvalues.substring(0, index + 1) + selectedvalues.substring(index + 3);      
       } 
      } 
      else { 
       selectedvalues = ""; 
      } 

Trả lời

37
var removeValue = function(list, value, separator) { 
    separator = separator || ","; 
    var values = list.split(separator); 
    for(var i = 0 ; i < values.length ; i++) { 
    if(values[i] == value) { 
     values.splice(i, 1); 
     return values.join(separator); 
    } 
    } 
    return list; 
} 

Nếu giá trị mà bạn đang tìm kiếm được tìm thấy, nó loại bỏ, và một dấu phẩy mới danh sách phân định trả lại. Nếu nó không được tìm thấy, danh sách cũ được trả về.

Cảm ơn Grant Wagner vì đã chỉ ra lỗi và nâng cao mã của tôi!

John Resign (jQuery, Mozilla) có một bài viết gọn gàng về JavaScript Array Remove mà bạn có thể thấy hữu ích.

+0

Tại sao các phiếu bầu xuống? – doomspork

+0

Bạn có thể bị downvoted vì 'selectedValues.split (", ")' trả về một mảng, các mảng không có phương thức 'indexOf()' trong JavaScript. –

+0

Bạn thưa bạn, là chính xác! Cảm ơn bạn đã chỉ ra rằng – doomspork

1

giá trị bây giờ là một mảng. Vì vậy, thay vì tự mình vượt qua.

Do:

var index = values.indexOf(value); 
if(index >= 0) { 
    values.splice(index, 1); 
} 

loại bỏ một đối tượng duy nhất từ ​​một chỉ số nhất định.

hy vọng điều này sẽ giúp

+0

BTW. để đưa mảng vào chuỗi một lần nữa ... chỉ cần làm: var somstring = values.join (','); – Jabezz

+1

@Jabezz: Điều này không thành công khi 'giá trị' là" 1,12,2 "và bạn muốn xóa" 2 ". –

0
function process(csv,valueToDelete) { 
    var tmp = ","+csv; 
    tmp = tmp.replace(","+valueToDelete,""); 
    if (tmp.substr(0,1) == ',') tmp = tmp.substr(1); 
    return tmp; 
} 
+0

Có lỗi! Quá trình gọi ('1,2,3,25,29,36', 2) sẽ trả về "1,3,5,9,36" khi trả về "1,3,25,29,36". – LukeH

2

Dưới đây là 2 giải pháp khả thi:

function removeValue(list, value) { 
    return list.replace(new RegExp(value + ',?'), '') 
} 

function removeValue(list, value) { 
    list = list.split(','); 
    list.splice(list.indexOf(value), 1); 
    return list.join(','); 
} 

removeValue('1,2,3', '2'); // "1,3" 

Lưu ý rằng điều này sẽ chỉ loại bỏ xuất hiện đầu tiên của một giá trị.

Cũng lưu ý rằng Array.prototype.indexOf không phải là một phần của ECMAScript ed. 3 (nó đã được giới thiệu trong JavaScript 1.6 - được triển khai trong tất cả các hiện thực hiện đại trừ JScript một - và bây giờ được mã hóa trong ES5).

+1

Ví dụ đầu tiên cũng sẽ thất bại. 22, 32, 42, v.v. Vì vậy, câu trả lời này không phải là câu trả lời. – epascarello

+4

Xem câu trả lời của Doomspork (http://stackoverflow.com/questions/1306164/1306225#1306225) cho những gì dường như là một thực hiện chính xác. –

+0

Tính năng này có hoạt động nếu có nhiều giá trị cần xóa không? – Breakthrough

1
// Note that if the source is not a proper CSV string, the function will return a blank string (""). 
function removeCsvVal(var source, var toRemove)  //source is a string of comma-seperated values, 
{             //toRemove is the CSV to remove all instances of 
    var sourceArr = source.split(",");    //Split the CSV's by commas 
    var toReturn = "";        //Declare the new string we're going to create 
    for (var i = 0; i < sourceArr.length; i++)  //Check all of the elements in the array 
    { 
     if (sourceArr[i] != toRemove)    //If the item is not equal 
      toReturn += sourceArr[i] + ",";   //add it to the return string 
    } 
    return toReturn.substr(0, toReturn.length - 1); //remove trailing comma 
} 

Để áp dụng nó quá giá trị var của bạn:

var values = removeVsvVal(selectedvalues, "2"); 
1

đoán im quá chậm nhưng đây là những gì tôi sẽ làm gì

<script language="javascript"> 
function Remove(value,replaceValue) 
{ var result = ","+value+","; 
result = result.replace(","+replaceValue+",",","); 
result = result.substr(1,result.length); 
result = result.substr(0,result.length-1); 
alert(result); 
} 

Remove("1,2,3",2) 
</script> 

thêm, trước và sau chuỗi đảm bảo rằng u chỉ loại bỏ các chuỗi chính xác u muốn

0

sử dụng nối, pop hoặc shift. tùy thuộc vào yêu cầu của bạn.

Bạn cũng có thể có "tìm thấy" các chỉ số của các mục trong mảng của bạn phù hợp đó bằng cách sử dụng một chức năng như một tìm thấy ở đây: http://www.hunlock.com/blogs/Ten_Javascript_Tools_Everyone_Should_Have

var tmp = [5,9,12,18,56,1,10,42,'blue',30, 7,97,53,33,30,35,27,30,'35','Ball', 'bubble']; 
//   0/1/2 /3 /4/5 /6 /7  /8 /9/10/11/12/13/14/15/16/17/ 18/ 19/  20 
var thirty=tmp.find(30);    // Returns 9, 14, 17 
var thirtyfive=tmp.find('35');  // Returns 18 
var thirtyfive=tmp.find(35);   // Returns 15 
var haveBlue=tmp.find('blue');  // Returns 8 
var notFound=tmp.find('not there!'); // Returns false 
var regexp1=tmp.find(/^b/);   // returns 8,20 (first letter starts with b) 
var regexp1=tmp.find(/^b/i);   // returns 8,19,20 (same as above but ignore case) 

Array.prototype.find = function(searchStr) { 
    var returnArray = false; 
    for (i=0; i<this.length; i++) { 
    if (typeof(searchStr) == 'function') { 
     if (searchStr.test(this[i])) { 
     if (!returnArray) { returnArray = [] } 
     returnArray.push(i); 
     } 
    } else { 
     if (this[i]===searchStr) { 
     if (!returnArray) { returnArray = [] } 
     returnArray.push(i); 
     } 
    } 
    } 
    return returnArray; 
} 
+0

Cần chỉ ra rằng phương thức tìm kiếm đang sửa đổi Nguyên mẫu mảng có thể ít hơn mong muốn đối với một số nhà phát triển. Nó ảnh hưởng có thể tỏa ra ngoài phạm vi dự định. – doomspork

6
function removeValue(list, value) { 
    return list.replace(new RegExp(",?" + value + ",?"), function(match) { 
     var first_comma = match.charAt(0) === ',', 
      second_comma; 

     if (first_comma && 
      (second_comma = match.charAt(match.length - 1) === ',')) { 
     return ','; 
     } 
     return ''; 
    }); 
}; 


alert(removeValue('1,2,3', '1')); // 2,3 
alert(removeValue('1,2,3', '2')); // 1,3 
alert(removeValue('1,2,3', '3')); // 1,2 
+0

mã này sẽ không hoạt động cho removeValue ('1,25,3', '2') – Rajapandian

0

hoặc

var csv_remove_val = function(s, val, sep) { 
    var sep = sep || ",", a = s.split(sep), val = ""+val, pos; 
    while ((pos = a.indexOf(val)) >= 0) a.splice(pos, 1); 
    return a.join(sep); 
} 
Các vấn đề liên quan