19

I have a csv string like this "1,2,3" and want to be able to remove a desired value from it.

For example if I want to remove the value: 2, the output string should be the following:

"1,3"

I'm using the following code but seems to be ineffective.

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 = "";
            }
Raúl Roa
  • 12,061
  • 13
  • 49
  • 64

9 Answers9

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

If the value you're looking for is found, it's removed, and a new comma delimited list returned. If it is not found, the old list is returned.

Thanks to Grant Wagner for pointing out my code mistake and enhancement!

John Resign (jQuery, Mozilla) has a neat article about JavaScript Array Remove which you might find useful.

Community
  • 1
  • 1
doomspork
  • 2,302
  • 1
  • 17
  • 24
  • You're probably be downvoted because `selectedValues.split(",")` returns an array, arrays don't have an `indexOf()` method in JavaScript. – Grant Wagner Aug 20 '09 at 17:38
  • 5
    +1. Seems to work reliably after your change. One final suggestion, make the signature `function(list, value, separator)` and add `separator = separator || ",";`. That would make it a generic function that can remove a value from any delimited string. – Grant Wagner Aug 20 '09 at 18:19
  • 3
    You've added the separator, but you don't use it, should be: `list.split(separator)` and `values.join(separator)` – Ulf Lindback Jun 01 '10 at 13:16
8
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
4

Here are 2 possible solutions:

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"

Note that this will only remove first occurrence of a value.

Also note that Array.prototype.indexOf is not part of ECMAScript ed. 3 (it was introduced in JavaScript 1.6 - implemented in all modern implementations except JScript one - and is now codified in ES5).

kangax
  • 38,898
  • 13
  • 99
  • 135
  • 1
    First example will also fail also. 22, 32, 42, etc. So this answer is not an answer. – epascarello Aug 20 '09 at 14:29
  • 4
    See Doomspork's answer (http://stackoverflow.com/questions/1306164/1306225#1306225) for what appears to be a correct implementation. – Grant Wagner Aug 20 '09 at 18:20
  • the array method is clever. Notice that it does type coercion though. var a = [1,2,3,4,'1','2','3']; console.log(a.toString().replace(new RegExp('1' + ',?','g'),'')); // returns 2,3,4,2,3 – Joshua Aug 20 '09 at 19:17
  • I've been using the last method with success. – Raúl Roa Aug 26 '09 at 14:39
3

values is now an array. So instead of doing the traversing yourself.

Do:

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

removing a single object from a given index.

hope this helps

Jabezz
  • 1,292
  • 3
  • 14
  • 17
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
}

To apply it too your var values:

var values = removeVsvVal(selectedvalues, "2");
Breakthrough
  • 2,444
  • 2
  • 23
  • 37
1

guess im too slow but here is what i would do

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

adding , before and after the string ensure that u only remove the exact string u want

Lil'Monkey
  • 991
  • 6
  • 14
0
function process(csv,valueToDelete) {
  var tmp = ","+csv;
  tmp = tmp.replace(","+valueToDelete,"");
  if (tmp.substr(0,1) == ',') tmp = tmp.substr(1);
  return tmp;
}
Alex Rodrigues
  • 2,567
  • 1
  • 14
  • 9
  • There's a bug! Calling process('1,2,3,25,29,36',2) will return "1,3,5,9,36" when it should return "1,3,25,29,36". – LukeH Aug 20 '09 at 21:15
0

use splice, pop or shift. depending on your requirement.

You could also have "find" the indexes of items in your array that match by using a function like the one found here : 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;
}
Joshua
  • 1,913
  • 1
  • 19
  • 31
  • It should be pointed out that the find method is modifying the Array prototype which can be less than desirable to some developers. It's affects can radiate out beyond the intended scope. – doomspork Aug 20 '09 at 17:56
0

or

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);
}
mykhal
  • 19,175
  • 11
  • 72
  • 80