2009-08-20 4 views
12

У меня есть строка csv, такая как «1,2,3», и вы хотите удалить из нее желаемое значение.удалить значение из значений, разделенных запятыми,

Например, если я хочу, чтобы удалить значение: 2, выходная строка должна быть следующей:

«1,3»

Я использую следующий код, но кажется неэффективным.

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

ответ

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

Если значение, которое вы ищете, найден, он удаляется, и новый разделенный запятыми список вернулся. Если он не найден, возвращается старый список.

Благодаря Grant Wagner для указания на мой код ошибки и улучшения!

John Resign (jQuery, Mozilla) имеет аккуратную статью о JavaScript Array Remove, которая может вам пригодиться.

+0

Почему пустые голоса? – doomspork

+0

Вы, вероятно, занижены, потому что 'selectedValues.split (", ")' возвращает массив, массивы не имеют метода indexOf() в JavaScript. –

+0

Вы, сэр, верны! Спасибо, что указали – doomspork

1

значения теперь представляют собой массив. Поэтому вместо того, чтобы совершать обход себя.

ли:

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

удаление одного объекта из заданного индекса.

надеюсь, что это помогает

+0

BTW. чтобы снова получить массив в строку ... просто выполните: var somstring = values.join (','); – Jabezz

+1

@Jabezz: Это не выполняется, когда 'value' равно« 1,12,2 », и вы хотите удалить« 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

Есть ошибка! Процесс вызова ('1,2,3,25,29,36', 2) вернет «1,3,5,9,36», когда он вернется «1,3,25,29,36». – LukeH

2

Вот 2 возможных решения:

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" 

Обратите внимание, что это будет только удалить первое вхождение значения.

Также обратите внимание, что Array.prototype.indexOf не является частью ECMAScript ed. 3 (он был введен в JavaScript 1.6 - реализован во всех современных реализациях, кроме JScript one, и теперь кодируется в ES5).

+1

Первый пример также потерпит неудачу. 22, 32, 42 и т. Д. Таким образом, этот ответ не является ответом. – epascarello

+4

См. Ответ Doomspork (http://stackoverflow.com/questions/1306164/1306225#1306225) для правильной реализации. –

+0

Работает ли это, если есть несколько значений для удаления? – 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 
} 

Чтобы применить это тоже ваши ценности Var:

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

догадка им слишком медленно, но вот то, что я хотел бы сделать

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

добавив, до и после строки убедитесь, что у только удалить точную строку и хотите

0

использование сращивания, поп или коробка передач. в зависимости от вашего требования.

Вы можете также «найти» индексы элементов в массиве, которые соответствуют с помощью функции, как найденному здесь: 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

Следует отметить, что метод find модифицирует Матричный прототип, который может быть менее желательным для некоторых разработчиков. Это влияет на излучение, выходящее за пределы предполагаемого объема. – 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

Этот код не будет работать для removeValue ('1,25,3', '2') – Rajapandian

0

или

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); 
} 
Смежные вопросы