Мне нужно преобразовать вывод журнала git в объект.
Я использую команду git log --all --graph --oneline --date-order.
* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch
| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change
| * 2a34d72 refactor(another): typo
| * 683d704 refactor(another): changes
* | 0120274 Merge remote-tracking branch 'origin/develop' into firstbranch
|\ \
После этого я создал массив, где каждый элемент массива соответствует строке этого вывода.
И с этим я хотел бы иметь такой массив:
[
{
art: "*",
commitHash: "8896805",
branches: ["origin/firstbranch"],
commitString: "test(firstbranch): this is my commit on this branch"
},
{
art: "| *",
commitHash: "5fef2da",
branches: ["testbranch", "origin/another", "another"],
commitString: "refactor(another): this is a change"
},
{
art: "| *",
commitHash: "2a34d72",
branches: [],
commitString: "refactor(another): typo"
},
{
art: "| *",
commitHash: "683d704",
branches: [],
commitString: "refactor(another): changes"
},
{
art: "* |",
commitHash: "0120274",
branches: [],
commitString: "Merge remote-tracking branch 'origin/develop' into firstbranch"
},
{
art: "|\ \",
commitHash: "",
branches: [],
commitString: ""
}
]
Но я не могу получить этот результат.
Заранее спасибо!
Извините, но я удалил свои попытки, потому что я был не на правильном пути.
@Nulji, вы должны добавить это, это заставляет людей отвечать точнее, чтобы понять, что не так с вашими усилиями.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете сделать что-то подобное с регулярным выражением.
alt регулярное выражение
^\W+ — соответствует всем несловным символам в начале строки.commitHash регулярное выражение
\w+ - Это соответствует всем символам слова, и мы выбираем только первое совпадениеbranches регулярное выражение
/\(.*?\)/ - Это соответствует всем веткам ( branches here )(Head -> и () на replacecommit регулярное выражение
/.*?\)|\W+/ — заменить все символы до первого ) или все символы, не являющиеся словами.let str = `* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch
| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change
| * 2a34d72 refactor(another): typo
| * 683d704 refactor(another): changes
* | 0120274 Merge remote-tracking branch 'origin/develop' into firstbranch
|\\ \\`
let splited = str.split('\n')
let op = splited.map(inp=>{
let alt = ""
inp = inp.replace(/^\W+/,(match)=>{alt=match; return ''})
let commitHash = ''
inp = inp.replace(/\s*(\w+)\s*/,(match,g1)=>{commitHash = g1;return ''})
let branches = ''
inp = inp.replace(/^\s*(\(.*?\))/,(match,g1)=>{branches = g1; return ''})
branches = branches ? branches.replace(/^\s*\(HEAD\s*->\s*|[)(]/g,'').split(/\s*,\s*/) : []
let commit = inp.trim()
return {alt,commitHash,branches,commit}
})
console.info(op)На стороне Примечание: - Обратите внимание, что это не полное доказательство. я рассмотрел случаи в соответствии с предоставленными данными, но может быть гораздо больше случаев
Спасибо, это почти то, что мне нужно. У меня просто проблема с вашим кодом: фиксация 2a34d72 и 683d704 в вашем примере не работает, потому что она дает мне ветку, но ее нет, тогда строка фиксации разбивается. Если вы можете исправить это быстро, огромное спасибо!
Я бы сказал, что немного стыдно использовать match дважды только для целей тернарного оператора. Вместо этого вы можете сделать let alt = (inp.match(/^\W+/) || [''])[0] (то же самое для других).
@Nulji, ты видишь, я внес некоторые изменения.
@Jeto да, я изменил его, замените совпавший, а затем продолжите, вы можете увидеть обновленный
Вот возможное решение с использованием одного регулярного выражения, затем обрезка для каждого значения и, наконец, расщепление разветвляется на массив:
const input = [
'* 8896805 (origin/firstbranch) test(firstbranch): this is my commit on this branch',
'| * 5fef2da (HEAD -> testbranch, origin/another, another) refactor(another): this is a change',
'| * 2a34d72 refactor(another): typo',
'| * 683d704 refactor(another): changes',
'* | 0120274 Merge remote-tracking branch \'origin/develop\' into firstbranch',
'|\\ \\'
];
const result = input.map(entry => {
let [, alt, commitHash, branches, commitString] = entry
.match(/^([|*\s\\]+)(?:\s+([a-f0-9]+)?(?:\s+\((?:HEAD\s+->\s+)?([^)]+)\))?(?:\s+(.*))?)?$/)
.map(value => value ? value.trim() : '');
branches = branches ? branches.split(/\s*,\s*/) : [];
return {alt, commitHash, branches, commitString};
});
console.info(result);
Пожалуйста, поделитесь своими попытками.