【问题标题】:how can i make my function handle multiple string arrays?如何让我的函数处理多个字符串数组?
【发布时间】:2020-11-20 15:21:22
【问题描述】:

我一直在做一些作业来复制一个类似 json 解析的函数,目前我写了一个如下的函数:

var arr = '[a, [a, bjng],  n]'
var intoArray = function(string) {
  if (string.length <= 2) {
    return [];
  }
  var resultsArr = [];
  var toJoin = [];
  var simpArr = string.slice(1, string.length - 1).replace(/['"]+/g, '').replace(/[' '']+/g, '').split(',');
  for (var a = 0; a < simpArr.length; a++) {
    if (simpArr[a].includes('[')) {
      while (!simpArr[a].includes(']')) {
        toJoin.push(simpArr[a]);
        a++;
      }
    }
    if (simpArr[a].includes(']')) {
      toJoin.push(simpArr[a]);
    }
  }
  var joined = toJoin.join(',')
  var joint = joined.slice(1, joined.length - 1).replace(/['"]+/g, '').replace(/[' '']+/g, '').split(',')
  for (var a = 0; a < simpArr.length; a++) {
    if (!toJoin.includes(simpArr[a])) {
      resultsArr.push(simpArr[a])
    }
    if (simpArr[a] === toJoin[0]) {
      resultsArr[a] = joint
    }
  }

  return resultsArr
};

console.log(intoArray(arr))

运行时,它将这个字符串'[a, [a, bjng], n]'(这只是一个大字符串)转换为[ 'a', [ 'a', 'bjng' ], 'n' ](这是一个包含多个字符串和另一个数组的数组,这是所需的行为)。但是,当示例字符串内部有多个数组时,例如'[a, [a, bjng],[c] , n]',结果是它被视为一个更大的数组,例如[ 'a', [ 'a', 'bjng]', '[c' ], 'n' ](请注意,它不是创建两个数组,而是认为'[a' trough 'c]' 是一个大数组数组),我仍在学习,因此非常感谢一些见解,或者如果有人知道我如何调整它以处理多个数组!还是更好的实现方式?

【问题讨论】:

  • 你需要研究“递归下降解析”。
  • 这不是一项简单的任务,对于初学者来说似乎也不适合。
  • 这并不复杂...

标签: javascript arrays string


【解决方案1】:

逻辑与我对您的类似问题 here 的上一个答案相同,除了它使用连续字符块而不是单个字符来处理比 1 更长的字符串。

const string = '[a, [a, bjng],  n]'.slice(1, -1);
const chunks = string.match(/\w+|[\[\]|,| ]/g);

const array = [];
let currArr = array;

for (const chunk of chunks) {
  /\w/.test(chunk) && currArr.push(chunk);
  chunk == ']' && (currArr = array);
  if (chunk == '[') {
    currArr = [];
    array.push(currArr);
  }
}

console.log(array); // [ 'a', [ 'a', 'bjng' ], 'n' ]

【讨论】:

    【解决方案2】:

    @GirkovArpa 开了个好头,但正如@Barmar 已经提到的:如果你想正确处理任意(更深)数组结构,你将需要某种递归。这是我的(初步)看法:

    const string = '[a, [ [d,e,[f,g]], bjng], [c], n]';
    
    function parse(str){
      function add2arr(a,p){ var c
        do c=p.shift()
        while( c && (/\w/.test(c)&&a.push(c) 
                  || c==','
                  || c=='[' &&a.push(add2arr([],p))) );
        return a
      }
      const parts = str.replace(/\s*/g,"").match(/\w+|[\[\],]/g);
      if(parts.shift()=='[') return add2arr([],parts);
    }
    
    console.log(parse(string))
    
    // or, much simpler: use JSON.parse:
    
    console.log(JSON.parse(string.replace(/(\w+)/g,'"$1"')));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-27
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-12
      • 2015-12-01
      • 1970-01-01
      相关资源
      最近更新 更多