Skip to content

Instantly share code, notes, and snippets.

@kukiron
Created October 8, 2024 15:14
Show Gist options
  • Save kukiron/7cfb8df5f718cf925bc62b70c94af0bb to your computer and use it in GitHub Desktop.
Save kukiron/7cfb8df5f718cf925bc62b70c94af0bb to your computer and use it in GitHub Desktop.
Complete a flat or nested JSON (without arrays). Default to "VALUE" for a missing key value.
const partialJson = `{"a1":"v1","a2":{"a3":"v3","a4":{"a5":"v5","a6"`;
// const partialJson = `{"a1":"v1","a2":{"a3":"v3","a4":{"a5`;
// const partialJson = `{"a1":"v1","a2":{"a3":"v3","a4":{"a5":"v5"}`;
const removeQuote = (str: string) => str.replace(/"/g, '');
const findSubstringAtIndex = (json: string) => (index: number) =>
json.substring(index + 1);
const insertClosingBrackets = (json: string) => {
const openBracketsCount = json.match(/{/g)?.length || 0;
const closeBracketsCount = json.match(/}/g)?.length || 0;
const closingBrackets = Array(openBracketsCount - closeBracketsCount)
.fill('}')
.join('');
return `${json}${closingBrackets}`;
};
const completePartialJson = (partialJson: string) => {
const lastIndexOfComma = partialJson.lastIndexOf(',');
const lastIndexOfColon = partialJson.lastIndexOf(':');
const isLastCharClosingBracket = partialJson[partialJson.length - 1] === '}';
const findLastItem = findSubstringAtIndex(partialJson);
// check if the last character is a closing bracket, only add matching brackets in that case
if (isLastCharClosingBracket) {
return insertClosingBrackets(partialJson);
}
if (lastIndexOfComma > lastIndexOfColon) {
const lastItem = findLastItem(lastIndexOfComma);
const formattedJson = partialJson.replace(
lastItem,
`"${removeQuote(lastItem)}":"VALUE"`
);
return insertClosingBrackets(formattedJson);
}
let updatedJson = partialJson;
const lastIndexOfOpeningBracket = partialJson.lastIndexOf('{');
if (lastIndexOfOpeningBracket > lastIndexOfColon) {
const lastItem = findLastItem(lastIndexOfOpeningBracket);
updatedJson = partialJson.replace(
lastItem,
`"${removeQuote(lastItem)}":"VALUE"`
);
} else {
const lastItem = findLastItem(lastIndexOfColon);
updatedJson = partialJson.replace(lastItem, `"${removeQuote(lastItem)}"`);
}
return insertClosingBrackets(updatedJson);
};
console.log(completePartialJson(partialJson));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment