2015-09-04 152 views
-1

我有這個JavaScript字符串:解析這個字符串的最佳方法是什麼?

var str = "ct [b r 0 0 100 100] b r 0 0 1000 1000 c f red"; 

,並希望得到這樣一個數組:

['ct', ['b', 'r', 0, 0, 100, 100], 'b', 'r', 0, 0, 1000, 1000, 'c', 'f', 'red']; 

在原來的字符串字母代表將要採取的行動,數字表示座標和有在那裏也是一個嵌套數組(第二項)。

我想這個問題是:如何在一些項目本身可能包含(未轉義的)空格時在空格上拆分字符串?

+0

能陣列嵌套到任意級別,或只是1爲根據你的例子? –

+0

_var x = JSON.stringify(str)_它甚至可以在數組中執行json數組 –

+0

是給定的輸入還是可以改變它? A會建議使用JSON.stringify(object)從JS對象創建一個字符串,然後使用JSON.parse(str)來恢復原始對象。 – once

回答

0

的jsfiddle:https://jsfiddle.net/e1xhq39w/

var str = "ct [b r 0 0 100 100] b r 0 0 1000 1000 c f red"; 
var strArr = str.split(' '); 
console.log(JSON.stringify(parseArray(strArr))); 


function parseArray(strArr) { 
    var finalArray = []; 
    var tempArray = []; 
    var start = -1; 
    var end = -1; 
    for(var i=0;i<strArr.length;i++) { 
     //skip array to a temp 
     if(strArr[i].indexOf('[') != -1) { 
      start = i; 
      tempArray.push(strArr[i].replace('[', '')); 
      continue; 
     } 
     if(strArr[i].indexOf(']') != -1) { 
      end = i; 
      start = -1; 
      tempArray.push(strArr[i].replace(']', '')); 
      finalArray.push(parseArray(tempArray)); 
      continue; 
     } 
     if(start != -1) { 
      tempArray.push(strArr[i]); 
      continue; 
     } 
     var number = Number(strArr[i]); 
     if(isNaN(number)) {   
      finalArray.push(strArr[i]) 
      } 
     else { 
      finalArray.push(number); 
     } 
    } 
    return finalArray; 
} 
-2

首先,您必須查看輸入數據並確定用於將數據拆分爲單個數組實體的條件。在這裏,它會是''

JavaScript有一個內置函數叫做split,它將字符串拆分成一個數組,並且你所要做的就是提供程序應該查找的字符,並且當它發現這個時字符,程序將在該點的陣列分割

var str = "ct [b r 0 0 100 100] b r 0 0 1000 1000 c f red"; 
var array = str.split(" "); //this will now store the str split into an array 

陣列應該等於:

ct, [b, r, 0, 0, 100, 100], b, r, 0, 0, 1000, 1000, c, f, red 

至於的[],我不確定

0

我WOU LD可能會嘗試這樣的事:

var str = "ct [b r 0 0 100 100] b r 0 0 1000 1000 c f red"; 

// the regex picks up the first 'element' (ct), the inner array 
// and all the rest 
var regex = /(.*)\[(.*)\](.*)/; 
var match = str.match(regex) 

// take the first 'element', and add it to the rest - 
// create an array 
var init = (match[1].trim() + match[3]).split(' '); 

// pass it through the checkNum function 
// init is an array that has strings and integers 
init = checkNum(init); 

// grab the inner array and run it through checkNum 
var inner = checkNum(match[2].split(' ')); 

// splice the inner array into the main array 
init.splice(1, 0, inner); 

function checkNum(arr) { 

    // for each element in the array, if it's conversation 
    // to an integer results in NaN, return the element, otherwise 
    // return the integer 
    for (var i = 0, l = arr.length; i < l; i++) { 
     arr[i] = isNaN(+arr[i]) ? arr[i] : +arr[i]; 
    } 
    return arr; 
} 

輸出

['ct', ['b', 'r', 0, 0, 100, 100], 'b', 'r', 0, 0, 1000, 1000, 'c', 'f', 'red']; 

DEMO

相關問題