Генерация массива из строки, разделенной запятыми и заключенной в круглые скобки, в Javascript - PullRequest
0 голосов
/ 18 марта 2020

Я пытаюсь разобрать строку в массив в Javascript при определенных условиях :

  1. Каждая запятая в строке разделяет различные элементы массива

  2. Элементы, заключенные в круглые скобки, являются подмассивом предшествующего им элемента

Пример:

total, limit, items(added_at, added_by)

превратится в

[total, limit, items[added_at, added_by]]

Дополнительная информация о том, почему я это делаю :

Я пытаюсь реплицировать логические ограничения полей спойтизации API c, используя Mon goose и MongoDB

для получения только общего количества дорожек и предела запроса: fields=total,limit

Точечный разделитель можно использовать для указания неповторяющихся полей, тогда как круглые скобки могут быть используется для указания повторяющихся полей внутри объектов. Например, чтобы получить только добавленную дату и идентификатор пользователя сумматора: fields=items(added_at,added_by.id)

Используйте несколько скобок для детализации вложенных объектов, например: fields=items(track(name,href,album(name,href)))

Ссылка: https://developer.spotify.com/documentation/web-api/reference-beta/#endpoint -get-плейлисты-треки

1 Ответ

1 голос
/ 18 марта 2020

Вот один из способов сделать это путем разбиения строки на токены и операторы стека:

function parseNestedList(str) {
    let pattern = /([^(),]*)([(),]?)/gm;
    let part, ret = [], stack = [], context = ret;

    while (((part = pattern.exec(str)) !== null) && (part[0].length > 0)) {
        if (part[1].length) { context.push(part[1]); } // Push token

        switch (part[2]) {
            case "(": // Descend
                stack.push(context);
                context.push(context = []);
                break;
            case ",": // Next
                continue;
            default: // Ascend
                context = stack.pop();
        }
    }

    return ret;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...