Javascript - 根据字典/对象中的键解析字符串
Javascript - Parse string based upon keys in dictionary / object
在我的 React 程序中,假设我有以下字典/对象
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
(请注意,任何键都没有任何其他键中存在的值 - 例如,任何键都不能包含 a
字母,因为那是一个不同的键)
我将收到一个字符串,该字符串 仅包含此对象的键的排列,因此,例如,可能的字符串条目将是:
- “abhellob”
- “ababByeahello”
- “再见再见”
- 等等
我希望创建一个函数,根据 myDict
的键将输入字符串分解成其组成部分。
所以,例如,
"abhellob"
会变成 ["a", "b", "hello", "b"]
如何创建这样的函数?我已经尝试过,但我迷失了处理 myDict
的不同长度的密钥,我不知道该怎么做。
在不同键之间交替的正则表达式就可以解决问题。
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const pattern = new RegExp(
Object.keys(myDict).join('|'),
'g'
);
console.log("abhellob".match(pattern));
console.log("ababByeahello".match(pattern));
console.log("ByehelloByeba".match(pattern));
(如果某些键可能有字符重叠,则首先要对键进行排序,以便最长的排在第一位。)
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const pattern = new RegExp(
Object.keys(myDict)
.sort((a, b) => a.length - b.length)
.join('|'),
'g'
);
console.log("abhellob".match(pattern));
console.log("ababByeahello".match(pattern));
console.log("ByehelloByeba".match(pattern));
您可以在没有正则表达式的情况下执行此操作:
function getFragments(entryString){
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const keys = Object.keys(myDict);
const result = [];
let remainingString = entryString;
while (remainingString) {
const nextWord = keys.find(key => remainingString.startsWith(key));
if (!nextWord) throw new Error("Couldn't match with word");
result.push(nextWord);
remainingString = remainingString.slice(nextWord.length);
}
return result;
}
console.log(getFragments("abhellob"));
console.log(getFragments("ababByeahello"));
console.log(getFragments("ByehelloByeba"));
在我的 React 程序中,假设我有以下字典/对象
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
(请注意,任何键都没有任何其他键中存在的值 - 例如,任何键都不能包含 a
字母,因为那是一个不同的键)
我将收到一个字符串,该字符串 仅包含此对象的键的排列,因此,例如,可能的字符串条目将是:
- “abhellob”
- “ababByeahello”
- “再见再见”
- 等等
我希望创建一个函数,根据 myDict
的键将输入字符串分解成其组成部分。
所以,例如,
"abhellob"
会变成["a", "b", "hello", "b"]
如何创建这样的函数?我已经尝试过,但我迷失了处理 myDict
的不同长度的密钥,我不知道该怎么做。
在不同键之间交替的正则表达式就可以解决问题。
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const pattern = new RegExp(
Object.keys(myDict).join('|'),
'g'
);
console.log("abhellob".match(pattern));
console.log("ababByeahello".match(pattern));
console.log("ByehelloByeba".match(pattern));
(如果某些键可能有字符重叠,则首先要对键进行排序,以便最长的排在第一位。)
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const pattern = new RegExp(
Object.keys(myDict)
.sort((a, b) => a.length - b.length)
.join('|'),
'g'
);
console.log("abhellob".match(pattern));
console.log("ababByeahello".match(pattern));
console.log("ByehelloByeba".match(pattern));
您可以在没有正则表达式的情况下执行此操作:
function getFragments(entryString){
const myDict = {
"a":"Value 1",
"b":"Value 2",
"hello":"Value 3",
"Bye":"Value 4"
}
const keys = Object.keys(myDict);
const result = [];
let remainingString = entryString;
while (remainingString) {
const nextWord = keys.find(key => remainingString.startsWith(key));
if (!nextWord) throw new Error("Couldn't match with word");
result.push(nextWord);
remainingString = remainingString.slice(nextWord.length);
}
return result;
}
console.log(getFragments("abhellob"));
console.log(getFragments("ababByeahello"));
console.log(getFragments("ByehelloByeba"));