将第n个分隔符的字符串拆分为javascript中的数组

时间:2015-09-12 01:18:28

标签: javascript jquery arrays string split

是否有javascript / jquery方法或函数可以让我在第n次出现选定分隔符时拆分字符串?我喜欢它的工作方式就像常规的str.split(分隔符)一样,除了在分隔符的每次出现时都不要拆分,每次都可以指示它跳过n个。

var str = "A,BB,C,DDD,EEEE,F";
var strAry = str.split(",");

会导致strAry看起来像{" A"," BB"," C"," DDD"," EEEE"" F"}

我想要的是{" A,BB"," C,DDD"," EEEE,F"}假设我将第n次出现设置为2。

我编写了一个似乎有用的小函数,但希望有一种更简单的方法:

function splitn(fullString, delimiter, n){
    var fullArray = fullString.split(delimiter);
    var newArray = [];
    var elementStr = "";
    for(var i = 0; i < fullArray.length; i++) {
        if (i == fullArray.length-1) {
            if (elementStr.length == 0) {
                elementStr = fullArray[i];
            } else {
                elementStr += (delimiter + fullArray[i]);
            }
            newArray.push(elementStr);
        } else {
            if (((i + 1) % n) == 0) {
                if (elementStr.length == 0) {
                    elementStr = fullArray[i];
                } else {
                    elementStr += (delimiter + fullArray[i]);
                }
                newArray.push(elementStr);
                elementStr = "";
            } else {
                if (elementStr.length == 0) {
                    elementStr = fullArray[i];
                } else {
                    elementStr += (delimiter + fullArray[i]);
                }
            }
        }
    };
    return newArray;
};

感谢。

2 个答案:

答案 0 :(得分:2)

你可以简单地使用Array.prototype.reduce()修改由你喜欢的分割返回的数组。这个想法类似于你的代码,只是更短。

function modify(str, n, delim) {
    return str.split(delim).reduce(function(output, item, i) {
        if (!(i % n)) {
            output.push(item);
        } else {
            output[i / n | 0] += delim + item;
        };
        return output;
    }, []);
};

modify("A,BB,C,DDD,EEEE,F", 3, ','); //["A,BB,C", "DDD,EEEE,F"]
modify("A,BB,C,DDD,EEEE,F", 2, ','); //["A,BB", "C,DDD", "EEEE,F"]

答案 1 :(得分:1)

编辑:刚刚注意到你想要使用任意的&#34; nth&#34;值。我更新了它,因此您只需将nth更改为您喜欢的任何正整数。

这是一种利用.indexOf()的第二个参数的方式,以便您可以在字符串中的最后一个结束点之后锚定您的搜索:

&#13;
&#13;
function splitn(fullString, delimiter, n) {
    var lastIdx = 0
    ,   idx = -1
    ,   nth = 0
    ,   result = [];

    while ((idx = fullString.indexOf(delimiter, idx + delimiter.length)) !== -1) {
      if ((nth = ++nth % n) === 0) {
        result.push(fullString.slice(lastIdx, idx));
        lastIdx = idx + 1;
      }
    }
    result.push(fullString.slice(lastIdx));
    return result;
}

var result = splitn("A,BB,C,DDD,EEEE,F", ",", 2);


document.body.innerHTML = "<pre>" + JSON.stringify(result, null, 4) + "</pre>";
&#13;
&#13;
&#13;