如何将字符串转换为JScript对象数组

时间:2017-05-25 03:27:07

标签: javascript arrays javascript-objects jscript ecmascript-3

在Javascript中,我有一个字符串,我需要转换为一个对象数组。

//ORIGINAL STRING :
var originalString = "[13, "2017-05-22 17:02:56", "Text111"], [25, "2017-05-22 17:03:03", "Text222"], [89, "2017-05-22 17:03:14","Text333"]";

我需要能够循环遍历每个对象,并使用索引获取3个属性。 这将给出(对于第一个数组):

myItem[0] => 13
myItem[1] => "2017-05-22 17:02:56"
myItem[2] => "Text111"

这首先听起来很简单(可能是),但经过多次尝试,我仍然被卡住了。

请注意我无法使用jQuery ,因为使用非常旧的Javascript规范运行:“Microsoft JScript”,符合EcmaScript 3标准。

我感谢你;)

2 个答案:

答案 0 :(得分:1)

这样的事情应该做

var regex = /\[([^\]]+)/g;
var originalString = '[13, "2017-05-22 17:02:56", "Text111"], [25, "2017-05-22 17:03:03", "Text222"], [89, "2017-05-22 17:03:14","Text333"]';
var result = regex.exec(originalString);
var container = [];
for (var j = 0; result ? true : false; j++) {
  var tokens= result[1].split(',');
  var tempContainer = []
  for (var i = 0; i < tokens.length; i++) {
    tempContainer[i] = tokens[i].replace(/["\s]/g, '');
  }
  container[j] = tempContainer;
  // continue the search
  result = regex.exec(originalString);
}
console.log(container);

答案 1 :(得分:1)

如果您可以使用JSON.parse,那么您可以将[]分别附加到字符串的开头和结尾,然后将其解析为数组阵列。

&#13;
&#13;
var originalString = '[13, "2017-05-22 17:02:56", "Text111"], [25, "2017-05-22 17:03:03", "Text222"], [89, "2017-05-22 17:03:14","Text333"]';

var result = JSON.parse("[" + originalString + "]");
console.log(result);
&#13;
&#13;
&#13;

但是,据我所知,JSON.parse不是ECMAScript 3投诉,因此您必须自己解析。
这样的事情应该会有所帮助:

&#13;
&#13;
var originalString = '[13, "2017-05-22 17:02:56", "Text111"], [25, "2017-05-22 17:03:03", "Text222"], [89, "2017-05-22 17:03:14","Text333"]';

function trimString(str, trims) {
  var left = 0;
  var right = str.length - 1;
  
  while (left < right && trims.indexOf(str[left]) != -1) {
    left++;
  }
   
  while (left < right && trims.indexOf(str[right]) != -1) { 
    right--;
  }
  
  return str.substr(left, right - left + 1);
}

function splitByCommasOutOfBrackets(str) {
  var result = [];
  var current = "";
  var bracketBalance = 0;
  
  for (var i = 0; i < str.length; i++)
  {
    switch (str[i]) {
      case '[':
        current = current + str[i];
        bracketBalance++;
        break;
        
      case ']':
        current = current + str[i];
        bracketBalance--;
        break; 
        
      case ',':
        if (bracketBalance === 0) {
          result.push(trimString(current, [" ", "[", "]", "\""]));
          current = "";
        } else {
          current = current + str[i];
        }
        break;  
        
      default:
        current = current + str[i];
        break;
    }
  }
  
  if (current.length > 0) {
    result.push(trimString(current, [" ", "[", "]", "\""]));
  }
  
  return result;
}

var arr = splitByCommasOutOfBrackets(originalString);
console.log("1: Split by commas which separate arrays");
console.log(arr);

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

console.log("2: Split every array by the same rules");
console.log(arr);
&#13;
&#13;
&#13;

我不太确定ECMAScript 3中存在哪些功能,我使用MDN。看起来ECMAScript 3中不存在像String.prototype.trim这样的许多函数。所以我必须自己重新实现它。如果我错了,您可以在JScript中使用它们,那么只需使用其中一些功能。

算法的一般概念如下:

  1. 用逗号分隔字符串括号中删除,即用逗号分隔数组。然后修剪每个字符串的空格,括号,引号 - 所有这些我们不需要的东西。结果,我们有一个字符串数组,每个字符串代表一个数组
  2. 然后对每个数组应用相同的规则,将其分隔为值。
  3. 请注意,此解决方案中所有值都作为字符串进行了线程化。

    如果你有更多的嵌套级别,它可以以递归的方式重写而不是循环,但它不太容易理解 - 我只是提供了一个最小的解决方案,它可以工作:)我相信你可以在很多方面改进它。