JavaScript中的多维数组分隔符

4
我一直在寻找一种更简洁的方法来表示Javascript中的多维数组,因此我想找到一种使用多个分隔符将数组分隔开的方式,并结合Javascript内置的string.split(separator)方法。
例如,字符串"what, am, I; doing, here, now"将变成[["what", "am", "I"],["doing", "here", "now"]]
是否有一种简洁的实现方式来实现这个函数呢?
var theString = "what, am, I; doing, here, now";
var theArray = getArray(theString, [",", ";"]); //this should return [["what", "am", "I"],["doing", "here", "now"]].

function getArray(theString, separators){
    //convert a string to a multidimensional array, given a list of separators
}
3个回答

7

最终编辑

正如@ Tom所指出的那样,我在单词中保留了一些逗号。以下是最终代码:

var str = "what, am, I; doing, here, now";

var arr = str.split(/\;\s*/g);
for (var i = 0; i < arr.length; i++){
    arr[i] = arr[i].split(/\,\s*/g);
}
console.log(arr);

AND FIDDLE


首先在第二个分隔符上进行拆分,然后对其中每个成员在另一个分隔符上进行拆分。

var str = "what, am, I; doing, here, now";

var arr = str.split(';');
for (var i = 0; i < arr.length; i++){
    arr[i] = arr[i].split(' ');
}

演示

请注意,您需要进行一些清理工作以删除第二个数组中的空格,但这应该很简单。


编辑 - 我感到充满活力 - 这是如何消除那个讨厌的前导空格

var str = "what, am, I; doing, here, now";

var arr = str.split(';');
for (var i = 0; i < arr.length; i++){
    arr[i] = arr[i].replace(/^\s*/, '').split(' ');
}

更新的JSFiddle链接


编辑 - 这就是我如此喜欢SO的原因。根据@Nathan,您只需在正则表达式上进行拆分并节省一些麻烦。

var str = "what, am, I; doing, here, now";

var arr = str.split(/\;\s*/g);
for (var i = 0; i < arr.length; i++){
    arr[i] = arr[i].split(' ');
}
console.log(arr);

UPDATED FIDDLE


1
最好的情况是函数能正确处理任意数量的分隔符(不仅仅是一个或两个)- 这将提供更大的灵活性。 - Anderson Green
1
@AndersonGreen - 毫无疑问 - 对于你来说,将上述代码泛化为一个接受分隔符参数的函数应该很简单 :) - Adam Rackis
1
为了去除空格,你也可以在第一次分割时使用 '; ' - Xymostech
@Xymostech - 当然。如果你知道第一个分隔符后面总是有一个空格,那么我认为这是更可取的方式。 - Adam Rackis
4
你可以使用正则表达式进行分割。如果一开始就用/\;\s*/g进行分割,就不需要之后再用replace(/^\s*/, '')了。 - Nathan Wall
显示剩余5条评论

1

这应该可以工作:

var theString = "what, am, I; another, string; doing, here, now";
 //this should return [["what", "am", "I"],["doing", "here", "now"]].

function getArray(theString, separators){
    //Firs split
    var strings = theString.replace(/\s+/g, '').split(separators.pop());
    //Second split
        var sep = separators.pop();
        for (var i = 0; i < strings.length; i++) {
            strings[i] = strings[i].split(sep);
        };
    console.log(strings);
    return strings;
}

var theArray = getArray(theString,["," ,";" ]);

更新:

现在代码应该可以正常工作了:http://jsfiddle.net/beTEq/1/


你测试过这个吗?因为我相当确定这不起作用。 - Xymostech
他是正确的。即使在函数中包含return strings,它也不能完全正常工作http://jsfiddle.net/beTEq/。 - Adam Rackis
@TomSarduy 函数 "getArray" 返回 undefined,但应该返回变量 strings 并将其打印到控制台。现在您需要做的就是在函数 getArray 的最后一行后添加 return strings;,以使它能正确地工作。 - Anderson Green
@AndersonGreen:是的,我忘记了,我太专注于控制台输出了。 - Tomas Ramirez Sarduy
@TomSarduy 另外,当有两个以上的分隔符时,似乎它无法工作 - 不过修复这个问题可能相当容易。 - Anderson Green

0

我找到了一个解决方案,可以处理任意数量的分隔符,基于这里的答案

function getArray(theString, separators) {
    separators = separators.reverse();
    var theArray = theString.split(separators[0]);
    for (var j = 1; j < separators.length; j++) {
        theArray = theArray.map(function mapper(v, i, a) {
            if (typeof v == "string") {
                return v.split(separators[j]);
            } else {
                return v.map(mapper);
            }
        });
    }
    return theArray;
}

console.log(JSON.stringify(getArray("A, b, c; d, e, f;g,h,i'a, b, c;d,e,f", [",", ";", "'"])));
//this will write [[["A"," b"," c"],[" d"," e"," f"],["g","h","i"]],[["a"," b"," c"],["d","e","f"]]] to the console.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接