tags:

views:

1060

answers:

10

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 = "";
            }
+2  A: 

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
BTW. to get the array into a string again ... just do: var somstring = values.join(',');
Jabezz
@Jabezz: This fails when `value` is "1,12,2" and you want to remove "2".
Grant Wagner
A: 
function process(csv,valueToDelete) {
  var tmp = ","+csv;
  tmp = tmp.replace(","+valueToDelete,"");
  if (tmp.substr(0,1) == ',') tmp = tmp.substr(1);
  return tmp;
}
Alex
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
A: 

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
The last method fails because there is no indexOf method for arrays. The first method is smart though. You can make it remove all instances of [value] using the 'g' modifier in the RegExp (new RegExp(value + ',?','g')
KooiInc
First example will also fail also. 22, 32, 42, etc. So this answer is not an answer.
epascarello
See Doomspork's answer (http://stackoverflow.com/questions/1306164/1306225#1306225) for what appears to be a correct implementation.
Grant Wagner
Does it work if there's multiple values to remove?
Breakthrough
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
I've been using the last method with success.
Raúl Roa
A: 
// 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
+4  A: 
var removeValue = function(list, value, separator) {
  separator = separator || ",";
  var values = list.split(",");
  for(var i = 0 ; i < values.length ; i++) {
    if(values[i] == value) {
      values.splice(i, 1);
      return values.join(",");
    }
  }
  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.

Doomspork
Why the down votes?
Doomspork
You're probably be downvoted because `selectedValues.split(",")` returns an array, arrays don't have an `indexOf()` method in JavaScript.
Grant Wagner
You sir, are correct! Thanks for pointing that out
Doomspork
+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
You've added the separator, but you don't use it, should be:`list.split(separator)` and `values.join(separator)`
Ulf Lindback
A: 

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

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

Hi... U wrote u r too slow but you solved my problem..

This is a perfect script..it works in IE as well as firefox..

Thank u so much..

Sanket Mehta
A: 
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
yohann richard
A: 

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