Как преобразовать строку в массив объектов JScript

В 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 ответа

Решение

Если бы вы только могли использовать JSON.parse тогда вы сможете добавить [ а также ] к началу и концу строки соответственно, а затем проанализируйте ее как массив массивов.

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

Однако, насколько я знаю, JSON.parse Это не жалоба ECMAScript 3, поэтому вам придется разбирать ее самостоятельно.
Примерно так должно помочь:

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

Я не совсем уверен, какая функциональность существует в ECMAScript 3, и я использовал MDN для этого. Похоже, многие функции, даже как String.prototype.trimне существует в ECMAScript 3. Поэтому мне пришлось переопределить его сам. Если я не прав, и вы можете использовать их в JScript, просто используйте вместо этого некоторые из этих функций.

Общая идея алгоритма заключается в следующем:

  1. Разделите строку запятыми из скобок, то есть запятыми, которые разделяют наши массивы. А затем обрежьте каждую строку пробелами, скобками, кавычками - все это нам не нужно. В результате мы имеем массив строк, каждая из которых представляет массив.
  2. Затем примените одно и то же правило для каждого массива, разделяя его на значения.

Обратите внимание, что все значения в этом решении представлены в виде строк.

Это может быть переписано рекурсивным способом вместо цикла, если у вас есть больше вложенных уровней, но это было бы менее понятно - я просто предоставил минимальное решение, которое работает:) Я уверен, что вы можете улучшить его многими способами.

Нечто подобное должно делать

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

Другие вопросы по тегам