2009-08-20 21 views
12

Tengo una cadena de csv como esta "1,2,3" y quiero poder eliminar un valor deseado de ella.eliminar el valor de valores separados por comas string

Por ejemplo si quiero quitar el valor: 2, la cadena de salida debe ser el siguiente:

"1,3"

estoy usando el siguiente código pero parece ser ineficaz.

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

Respuesta

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 se determina que el valor que está buscando, se remueve, y una nueva lista delimitada por comas devueltos. Si no se encuentra, se devuelve la lista anterior.

¡Gracias a Grant Wagner por señalar el error y la mejora de mi código!

John Resign (jQuery, Mozilla) tiene un buen artículo sobre JavaScript Array Remove que puede serle útil.

+0

¿Por qué los votos hacia abajo? – doomspork

+0

Probablemente esté votando porque 'selectedValues.split (", ")' devuelve una matriz, las matrices no tienen un método 'indexOf()' en JavaScript. –

+0

¡Usted señor, es correcto! Gracias por señalar que – doomspork

1

values ​​es ahora una matriz. Entonces en lugar de hacer el recorrido usted mismo.

hacer:

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

eliminación de un solo objeto a partir de un índice determinado.

espero que esta ayuda

+0

cierto. para volver a poner la matriz en una cadena ... simplemente hazlo: var somstring = values.join (','); – Jabezz

+1

@Jabezz: Esto falla cuando 'value' es" 1,12,2 "y desea eliminar" 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

¡Hay un error! El proceso de llamada ('1,2,3,25,29,36', 2) devolverá "1,3,5,9,36" cuando debería devolver "1,3,25,29,36". – LukeH

2

Aquí hay 2 posibles soluciones:

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" 

Tenga en cuenta que esto sólo se eliminará primera aparición de un valor.

También tenga en cuenta que Array.prototype.indexOf no es parte de ECMAScript ed. 3 (se introdujo en JavaScript 1.6, implementado en todas las implementaciones modernas, excepto JScript one, y ahora está codificado en ES5).

+1

El primer ejemplo también fallará también. 22, 32, 42, etc. Así que esta respuesta no es una respuesta. – epascarello

+4

Consulte la respuesta de Doomspork (http://stackoverflow.com/questions/1306164/1306225#1306225) para lo que parece ser una implementación correcta. –

+0

¿Funciona si hay múltiples valores para eliminar? – 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 
} 

aplicarlo también sus valores var:

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

conjetura im demasiado lento, pero aquí es lo que yo haría

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

añadiendo, antes y después de la cadena asegurar que u sólo eliminan la cadena exacta u desea

0

uso empalme, pop o shift. dependiendo de tu requerimiento

También podría tener "encontrar" los índices de los elementos de la matriz de ese partido mediante el uso de una función como la que se encuentra aquí: 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

Debe señalarse que el método find está modificando el Prototipo de matriz que puede ser menos que deseable para algunos desarrolladores. Sus efectos pueden irradiar más allá del alcance deseado. – 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

este código no funcionará para removeValue ('1,25,3', '2') – Rajapandian

0

o

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