eliminar el valor de la cadena de valores separados por comas

Tengo una cadena de csv como esta "1,2,3" y quiero poder eliminar un valor deseado de ella.

Por ejemplo, si deseo eliminar el valor: 2, la cadena de salida debería ser la 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 = ""; } 

 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 encuentra el valor que está buscando, se elimina y se devuelve una nueva list delimitada por comas. Si no se encuentra, se devuelve la list 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 Array de JavaScript Eliminar, que puede serle útil.

 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 

Aquí hay 2 soluciones posibles:

 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 count que esto solo eliminará la primera aparición de un valor.

También tenga en count 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).

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

Hacer:

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

eliminar un solo object de un índice dado.

espero que esto ayude

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

Para aplicarlo también tus valores var:

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

Supongo que soy demasiado lento, pero esto es lo que 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> 

agregando, antes y después de la cadena, asegúrese de que solo elimina la cadena exacta que desea

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

use empalme , pop o shift . dependiendo de tu requerimiento

También podría haber "encontrado" los índices de los elementos en su matriz que coinciden utilizando una function 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; } 

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