2015-09-04 4 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 

Что касается [] s, я не уверен,

0

Я Wou Л.Д., вероятно, попробовать что-то вроде этого:

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; 
} 

OUTPUT

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

DEMO

Смежные вопросы