Как мне разобрать первые n строк массива JSON String в JavaScript? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть строка JSON, которая является массивом.

arrayString = "[
  { fName: 'John', lName: 'Doe'},
  { fName: 'Jane', lName: 'Doe'},
  { fName: 'Josh', lName: 'Doe'},
  { fName: 'Jack', lName: 'Doe'},
  { fName: 'Jill', lName: 'Doe'},
  { fName: 'Josh', lName: 'Doe'},
  { fName: 'Jean', lName: 'Doe'},
  { fName: 'Jake', lName: 'Doe'},
  { fName: 'Judy', lName: 'Doe'},
  { fName: 'Jery', lName: 'Doe'},
]";

Допустим, это массив тысяч элементов. Если я проанализирую это сразу, используя .json (), это займет много памяти. То, что я хотел бы сделать, - это проанализировать только первые n строк, которые мне нужны, как, например, разбиение на страницы на стороне клиента, где данные извлекаются из строки. Я не могу контролировать, как этот огромный объем данных передается с сервера.

1 Ответ

0 голосов
/ 06 ноября 2018

Эта проблема действительно должна решаться на стороне сервера с помощью правильной конструкции API, но вы также можете взглянуть на диапазон запросов . Используя их, вы можете запросить часть данных, отклонить последнюю, которая, скорее всего, будет искажена, и повторить. Это гарантирует, что клиент не будет загружать и хранить слишком много данных одновременно.

Но если вы хотите использовать синтаксический анализ частей всего набора данных, который уже находится на клиентском компьютере, то это отличный пример использования для генераторов из ES6 (ES2015):

/**
 * Generator yielding a given number of records at a time.
 * @param {string} data          Data from which to extract.
 * @param {number} n             Number of objects per yield.
 * @yield {string} Array with the specified number of objects. Represented as
 *                 JSON-valid string.
 */
function* getNRecords(data, n) {
  let index = 0;
  while (index < data.length) {
    let result = data.substring(index).split('}', n).join('}');

    result = result.endsWith('}]') ? result : result + '}]';
    result = index > 0 ? '[' + result.trim() : result; // !result.startsWith('[') ?
    
    index += result.length;
    yield result;
  }
}

/* === EXAMPLE === */

const exampleData = '[{a: 1, b: 2}, {c: 3, d: 4}, {e: 5, f: 6}, {g: 7, h: 8}]';
const batchSize = 3;

for (let nRecords of getNRecords(exampleData, batchSize)) {
  console.log(nRecords); // TODO parse here
}

Здесь происходит до N объектов: data.substring(index).split('}', n).join('}');.

...