#javascript
#javascript
Вопрос:
Если у меня есть строка ниже, как я могу выполнить поиск по ней и вернуть объект с ключом, представленным {{ key }}, и значением, установленным для слова, прикрепленного к нему, например, not!пробел между ними.
Я не понимаю, как я буду искать каждое вхождение в строке, которая начинается с {{ …имеет некоторое имя … и заканчивается на }}, поскольку его не всегда будут называть один, два, три, четыре, как в примере ниже.
Пример:
"The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf"
obj={
one:"onyx",
two:"jumps",
three:"lazy",
four:NULL
}
Обратите внимание, что {{four}} имеет значение NULL, потому что это пробел перед словом dwarf . Слово dward напрямую не привязано к {{четыре}}
благодарен за любую помощь, спасибо.
Комментарии:
1. Что делать, если
{{one}}
происходит несколько раз?2. не имеет значения…. допустим, сохраните первое вхождение и проигнорируйте, если оно появится снова.
Ответ №1:
Вы могли бы использовать регулярное выражение, чтобы найти связанные свойства во входной строке и их значение. Затем используйте Object.fromEntries
, чтобы превратить эти пары ключ-значение в объект. Обратите внимание, что это будет принимать последнее значение, если свойство встречается в строке более одного раза.
const parse = (str) =>
Object.fromEntries(Array.from(str.matchAll(/{{(w )}}(S*)/g), arr =>
[arr[1], arr[2] || null]));
// demo
let s = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
let result = parse(s);
console.log(result);
Если у вас нет поддержки matchAll
, то:
const parse = (str) => {
let regex = /{{(w )}}(S*)/g;
let match;
let result = {};
while (match = regex.exec(str)) {
result[match[1]] = match[2] || null;
}
return resu<
}
// demo
let s = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
let result = parse(s);
console.log(result);
Комментарии:
1. Спасибо. но что, если я не знаю названия реквизитов, но сначала должен искать их в строке. все, что находится внутри {{ … }}
2. Добавлено решение для случаев, когда вам нужно какое-либо свойство в строке.
3. второе решение — это то, что я ищу, но при тестировании его в jsbin я получаю сообщение об ошибке: «str.matchAll не является функцией»: jsbin.com/miyaliduwo/edit?js ,консоль
4. Это часть текущей версии JavaScript, ECMAScript 2020. Какую версию вы поддерживаете?
5. Добавлена версия, которая не используется
matchAll
.
Ответ №2:
Вы также можете поступить следующим образом:
let a = (x) =>{
let obj = {};
let z = x.split(' ');
let m = z.filter(x1 => x1.charAt(0) == '{')
m.forEach(x2=> obj[x2.substr(2,x2.indexOf('}')-2)] = x2.substr(x2.lastIndexOf('}') 1) == '' ? null : x2.substr(x2.lastIndexOf('}') 1))
console.log(obj);
}
a("The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf")
Это может решить ваш запрос.
Ответ №3:
Это будет работать
const str = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
const result = {}
str.split("{{")
.map(m => ({
[m.split('}}')[0]]: m.includes("}}")
amp;amp; (m.split('}}')[1].split(' ')[0] || null)
})).filter(e => e[Object.keys(e)[0]] != false).forEach(e => { result[Object.keys(e)[0]] = Object.values(e)[0] })
console.log("result", result)
Ответ №4:
Этот пример немного подробный, но удовлетворяет потребности в именах переменных в {{}}
.
Этот код немного подробный, но позволяет читать и понимать:
const str = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
let output = str.match(/({{w*}}w*b|{{w*}} )/g).map(sub=>{
const subArr = sub.replace('{{','').split('}}');
const o = new Object();
o[subArr[0]] = subArr[1];
return o;
});
console.log(output);