2009-08-20 11 views
12

J'ai une chaîne csv comme celle-ci "1,2,3" et je veux pouvoir en retirer une valeur désirée.Supprimer la valeur des valeurs séparées par des virgules Chaîne

Par exemple, si je veux supprimer la valeur: 2, la chaîne de sortie devrait être la suivante:

« 1,3 »

J'utilise le code suivant mais semble être inefficace.

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

Répondre

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

Si la valeur que vous cherchez se trouve, il est retiré, et une nouvelle liste délimitée par des virgules retourné. S'il n'est pas trouvé, l'ancienne liste est renvoyée.

Merci à Grant Wagner pour souligner mon erreur de code et l'amélioration! John Resign (jQuery, Mozilla) a un article intéressant sur JavaScript Array Remove que vous pourriez trouver utile.

+0

Pourquoi les votes négatifs? – doomspork

+0

Vous êtes probablement downvoted car 'selectedValues.split (", ")' renvoie un tableau, les tableaux n'ont pas de méthode 'indexOf()' dans JavaScript. –

+0

Monsieur, vous avez raison! Merci de le signaler – doomspork

1

valeurs est maintenant un tableau. Donc, au lieu de faire la traversée vous-même.

faire:

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

la suppression d'un seul objet à partir d'un indice donné.

Espérons que cela aide

+0

BTW. pour obtenir le tableau dans une chaîne à nouveau ... juste faire: var somstring = values.join (','); – Jabezz

+1

@Jabezz: Cela échoue lorsque 'value' est" 1,12,2 "et que vous voulez supprimer" 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

Il y a un bug! Appelant le processus ('1,2,3,25,29,36', 2) retournera "1,3,5,9,36" quand il devrait retourner "1,3,25,29,36". – LukeH

2

Voici 2 solutions possibles:

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" 

Notez que ce ne supprime la première occurrence d'une valeur.

Notez également que Array.prototype.indexOf ne fait pas partie d'ECMAScript ed. 3 (il a été introduit dans JavaScript 1.6 - implémenté dans toutes les implémentations modernes sauf JScript 1 - et est maintenant codé dans ES5).

+1

Le premier exemple échouera également. 22, 32, 42, etc. Donc, cette réponse n'est pas une réponse. – epascarello

+4

Voir la réponse de Doomspork (http://stackoverflow.com/questions/1306164/1306225#1306225) pour ce qui semble être une implémentation correcte. –

+0

Cela fonctionne-t-il s'il y a plusieurs valeurs à supprimer? – 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 
} 

Pour appliquer trop vos valeurs var:

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

guess im trop lent, mais voici ce que je ferais

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

ajouter, avant et après la chaîne assurez-vous que u enlever uniquement la chaîne exacte u want

0

utilisation épissures, pop ou Maj. en fonction de vos besoins.

Vous pouvez aussi « trouver » les indices des éléments dans votre tableau qui correspondent à l'aide d'une fonction comme celle qui se trouve ici: 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

Il est à noter que la méthode find est en train de modifier le Un prototype de tableau qui peut être moins que souhaitable pour certains développeurs. Ses affects peuvent rayonner au-delà de la portée prévue. – 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

ce code ne fonctionnera pas pour removeValue ('1,25,3', '2') – Rajapandian

0

ou

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