ae_ph
@ae_ph
I'm a owl )

Как строку в текстовом файле преобразовать в объект?

Как я могу преобразовать строку @import 'vars'; в объект?
Т.е. @import это будет ключ
А vars это будет значение
Что-то подобное должно получится let a = { @import: 'vars' }
Я прочитываю текстовый файл, нахожу значения @import их несколько и хочу их преобразовать в объекты.
Но не могу доехать до того как именно это сделать.

const fs = require('fs');
const log = console.log;

if (data.indexOf('@import') >= 0) { // Если файл содержит в себе @import тогда
    // let a = str.split(';')[0]; // Получем значение до знака ;
    // let b = file.contents.split('@import')[1]; // Получем значение после @import
    // let value = JSON.parse
    // let obj = '@import' [value]
    // let object = obj.split(separator)
    fs.readFile(file.path, "utf8",
        function(error, data) {
            if (error) throw error;
            if (data.indexOf('@import') >= 0) {
                log('===============' + data)
            }
        });
} else {
    log('error file is not a @import')
}
  • Вопрос задан
  • 74 просмотра
Решения вопроса 1
ae_ph
@ae_ph Автор вопроса
I'm a owl )
Я сделал это через сравнение по регулярному выражению.
file - Файл.
file.path - Путь к файлу.
Передаю файл в функцию...
Далее прочитываю fs.readFile нужные мне файлы file.path методами nodejs
Создаю цикл do...while с условием.
В условии сравниваю прочитанный файл по регулярному выражению и в конце добавляю полученные значения в массив.

Составляющие рег. выражения:
@import - буквально эта последовательность символов
\s+ - как минимум один пробельный символ
["'] - ровно один символ кавычек (либо ", либо ')
([^"']+) - захват (в первую группу) любых символов кроме " и ', как минимум один такой "некавычковый" символ

Квантификатор + ("одно или больше") жадный по-умолчанию, поэтому в группу захвата результата попадает максимально возможное количество "некавычковых" символов входной строки. Аналогично и с пробелами: с данным квантификатором, токену \s будет соответствовать как можно большее количество пробельных символов.

Завершающая часть выражения ["']; необязательна, работать будет и без нее: в пример эта часть добавлена только для лучшего понимания рег.выражений (с этой частью, выражение целиком описывает statement с директивой @import).


const fs = require('fs');
const log = console.log;

fs.readFile(file.path, "utf8", (err, elem) => {
    if (err) throw err;
    log('element' + elem) // Содержимое файлов которые я прочитывал.
    let result;
    do {
        const regexp = /@import\s*["']([^"']+)["'];/gi; // Регулярное выражение 
        let result = elem.matchAll(regexp); // Метод str.matchAll(regexp) используется, для поиска всех совпадений вместе со скобочными группами.

        // получение массива строк со значениями из первой группы рег.выражения:
        const matchGroupValues = [...result].map(([, group1]) => group1);
        log(matchGroupValues); // [ 'vars', 'dwada', 'global' ] 
        // оборачивание полученных значений в массивы:
        const valuesInArrays = matchGroupValues.map(value => [value]);
        log(valuesInArrays); // [ [ 'vars' ], [ 'dwada' ], [ 'global' ] ]
        for (let value of valuesInArrays) {
            file.stem = value;
            // log('----------------' + value.join())
            log('----------------' + file.stem) // Имена файлов равны импортам (@import name)
        }
    } while (result >= 0);
})
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы