2009-08-20 151 views
12

我有一個像這樣的「1,2,3」csv字符串,並希望能夠從中刪除所需的值。從逗號分隔值中刪除值字符串

例如,如果我想刪除值:2,輸出字符串應該是以下幾點:

「1,3」

我用下面的代碼,但似乎是無效的。

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 = ""; 
      } 

回答

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; 
} 

如果發現你正在尋找的價值,它的拆除,以及新的以逗號分隔的列表中返回。如果找不到,則返回舊列表。

感謝Grant Wagner指出我的代碼錯誤和增強!

John Resign(jQuery,Mozilla)有一篇關於JavaScript Array Remove的整潔的文章,您可能會發現它很有用。

+0

爲什麼倒票? – doomspork 2009-08-20 13:52:09

+0

您可能會因爲'selectedValues.split(「,」)'返回一個數組而導致downvoted,因此數組在JavaScript中沒有'indexOf()'方法。 – 2009-08-20 17:38:20

+0

您先生,是正確的!感謝您指出, – doomspork 2009-08-20 17:49:03

1

值現在是一個數組。所以不要自己穿越。

做:

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

從給定的索引中刪除單個對象。

希望這有助於

+0

BTW。再次將數組轉換爲字符串...只是: var somstring = values.join(','); – Jabezz 2009-08-20 13:34:31

+1

@Jabezz:當'value'是「1,12,2」,並且你想刪除「2」時失敗。 – 2009-08-20 17:40:11

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

有一個錯誤!調用過程('1,2,3,25,29,36',2)返回「1,3,5,9,36」時應返回「1,3,25,29,36」。 – LukeH 2009-08-20 21:15:18

2

這裏有2個可能的解決方案:

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" 

注意,這隻會移除值的第一次出現。請注意0​​不是ECMAScript編輯的一部分。 3(它是在JavaScript 1.6中引入的 - 在除了JScript之外的所有現代實現中實現 - 現在已經在ES5中編碼)。

+1

第一個例子也會失敗。 22,32,42等等,所以這個答案不是答案。 – epascarello 2009-08-20 14:29:02

+4

請參閱Doomspork的答案(http://stackoverflow.com/questions/1306164/1306225#1306225)看起來是一個正確的實現。 – 2009-08-20 18:20:24

+0

如果有多個要刪除的值,它會工作嗎? – Breakthrough 2009-08-20 19:07:08

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 
} 

應用它太貴VAR值:

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

猜測IM太慢了,但這裏是我會做

<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> 

之前添加,字符串後確保ü只能去除確切的字符串ü要

0

使用拼接流行轉變。取決於您的要求。

你也可以有使用功能,如一個在這裏找到你的數組中的「查找」項的指標那場比賽: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

應該指出find方法正在修改數組原型對於某些開發人員來說可能不太理想。它的影響可能超出預期的範圍。 – doomspork 2009-08-20 17:56:57

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

此代碼不適用於removeValue('1,25,3','2') – Rajapandian 2018-02-08 18:40:10

0

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); 
}