将javascript字符串拆分为数组

时间:2016-12-28 21:33:28

标签: javascript arrays

我有这个javscript字符串:

响应

"[[[#],[b,#],[b,w,b,b,b,#],[b,#],[b,w,w,b,#]],[[b,#],[b,b,#],[b,b,w,#],[b,b,b,#],[b,b,#]],[[b,#],[b,b,b,b,#],[b,w,#],[b,b,b,#],[b,#]],[[b,#],[b,#],[w,w,w,#],[b,b,w,w,#],[b,w,#]],[[b,#],[b,b,b,b,#],[b,w,b,#],[b,w,#],[b,b,#]]]"

这对应于棋盘游戏和哪个领域(例如[b,w,b,b,b,#])是 b 缺乏且 w 的单元格海特片。 是堆栈的顶部。

我需要解析这个以创建一个tile数组。

我有这个:

XMLscene.prototype.readBoard = function(data){
    var response = data.target.response;
    console.log("REPONSE  NO PARS" + response);
    response = response.split("],");
    console.log("REPONSE " + response);
    response[0] = response[0].substring(1);
    response[5] = response[5].substring(0, response[5].length - 2);
    for(var i = 0; i < response.length; i++)
    {
        response[i] = response[i].substring(1);
        response[i] = response[i].split("),");
        for(var j = 0; j < response[i].length; j++)
            response[i][j] = response[i][j].substring(5);
    }
    this.scene.board.loadTiles(response);
    //this.scene.client.getPrologRequest('quit', 0, 1);
};

在此函数中解析:

gameBoard.prototype.loadTiles = function(board){
    console.log("BOARD : " + board);
    this.tiles = [];
    for (var i = 0; i < board.length; i++){
        for (var j = 0; j < board[i].length; j++){
            var player = board[i][j].split(",")[0];
            console.log("PLAYER : " + player);
            var type = board[i][j].split(",")[1];
            console.log("Type : " + type);
            if (type != "e") {
                var tile = this.createTile(type, this.scene ,i*6 + j+100, player);
                tile.line = i;
                tile.col = j;
                this.tiles.push(tile);
            }
        }
    }


}

我想要的董事会结构是这样的: 对于第一个堆栈:[#] 它是一个空单元

[b,#] - 一个单件的单元格 - 黑色

[b,w,w,b,#] - 底部有黑色部分,顶部有两个白色部分和黑色的单元格,因此黑色播放器是堆叠的拥有者!

堆栈所有者是将他的作品放在堆栈顶部(最接近#)的玩家

有没有办法获得一个数组,每个堆栈都是它的元素?

此致

3 个答案:

答案 0 :(得分:3)

您可以像这样将数据转换为JSON,忽略哈希值,因为它们似乎提供已知的信息(堆栈在右侧结束):

var response = JSON.parse(response.replace(/,?#/g, '').replace(/[bw]/g, '"$&"'));

然后你可以在(i,j)识别堆叠的当前玩家,如下所示:

var player = board[i][j].slice(-1)[0]; // last element on the stack

段:

// Sample data
var response = "[[[#],[b,#],[b,w,b,b,b,#],[b,#],[b,w,w,b,#]],[[b,#],[b,b,#],[b,b,w,#],[b,b,b,#],[b,b,#]],[[b,#],[b,b,b,b,#],[b,w,#],[b,b,b,#],[b,#]],[[b,#],[b,#],[w,w,w,#],[b,b,w,w,#],[b,w,#]],[[b,#],[b,b,b,b,#],[b,w,b,#],[b,w,#],[b,b,#]]]";

// Convert to nested array
var board = JSON.parse(response.replace(/,?#/g, '').replace(/[bw]/g, '"$&"'));

// Print the stack at 3, 3
console.log(board[3][3].join(','));

// Print player for that stack:
console.log(board[3][3].slice(-1)[0]);

答案 1 :(得分:0)

将您的字符串修改为这样......

var myString = '[[[#],[b,#],[b,w,b,b,b,#],[b,#],[b,w,w,b,#]],[[b,#],[b,b,#],[b,b,w,#],[b,b,b,#],[b,b,#]],[[b,#],[b,b,b,b,#],[b,w,#],[b,b,b,#],[b,#]],[[b,#],[b,#],[w,w,w,#],[b,b,w,w,#],[b,w,#]],[[b,#],[b,b,b,b,#],[b,w,b,#],[b,w,#],[b,b,#]]]' 

用&#34;&#34;

替换元素

现在运行以下:

var myArrayObject = JSON.parse(myString);

您刚刚将其转换为数组。

示例代码: https://fiddle.jshell.net/3gvzmwef/21/

答案 2 :(得分:0)

快速而肮脏的解决方案是使用String.prototype.replace()引用所有元素,然后将整个结果放入eval()

var str = "[[[#],[b,#],[b,w,b,b,b,#],[b,#],[b,w,w,b,#]],[[b,#],[b,b,#],[b,b,w,#],[b,b,b,#],[b,b,#]],[[b,#],[b,b,b,b,#],[b,w,#],[b,b,b,#],[b,#]],[[b,#],[b,#],[w,w,w,#],[b,b,w,w,#],[b,w,#]],[[b,#],[b,b,b,b,#],[b,w,b,#],[b,w,#],[b,b,#]]]";
var res = eval(str.replace(/[bw#]/g, "'$&'"));
console.log(res);