Еще один простой, но эффективный метод заключается в том, чтобы повторно использовать split + join.
"a=b,c:d".split('=').join(',').split(':').join(',').split(',')
По существу, разделение, за которым следует соединение, похоже на глобальную замену, поэтому это заменяет каждый разделитель запятой, а затем все заменены, он делает окончательное расщепление на запятую
. Результат выражения:
['a', 'b', 'c', 'd']
. Расширяясь на этом, вы также можете поместить его в функцию:
function splitMulti(str, tokens){
var tempChar = tokens[0]; // We can use the first token as a temporary join character
for(var i = 1; i < tokens.length; i++){
str = str.split(tokens[i]).join(tempChar);
}
str = str.split(tempChar);
return str;
}
Использование:
splitMulti('a=b,c:d', ['=', ',', ':']) // ["a", "b", "c", "d"]
Если вы используете эту функцию много, возможно, стоит даже рассмотреть возможность упаковки String.prototype.split
для удобства (я думаю, что моя функция достаточно безопасна - единственное соображение дополнительные служебные данные условных выражений (minor) и тот факт, что ему не хватает реализации предельного аргумента, если массив передан).
Обязательно включите функцию splitMulti
, если использовать этот подход к ниже просто обертывает его :). Также стоит отметить, что некоторые люди недовольны расширением встроенных модулей (поскольку многие люди делают это неправильно, и могут возникать конфликты), поэтому, если сомневаетесь, поговорите с кем-то старше, прежде чем использовать это или спросите о SO :)
var splitOrig = String.prototype.split; // Maintain a reference to inbuilt fn
String.prototype.split = function (){
if(arguments[0].length > 0){
if(Object.prototype.toString.call(arguments[0]) == "[object Array]" ) { // Check if our separator is an array
return splitMulti(this, arguments[0]); // Call splitMulti
}
}
return splitOrig.apply(this, arguments); // Call original split maintaining context
};
Использование:
var a = "a=b,c:d";
a.split(['=', ',', ':']); // ["a", "b", "c", "d"]
// Test to check that the built-in split still works (although our wrapper wouldn't work if it didn't as it depends on it :P)
a.split('='); // ["a", "b,c:d"]
Наслаждайтесь!