我需要監聽輸入并動態獲取其值,當碰巧鍵入特定的“標志”時,獲取接下來鍵入的任何內容,直到再次出現標志。
讓我解釋 :
假設我有一組“標志”
let flags = ['foo','bar','baz']
我有一個要監聽的輸入,它給了我以下字串(動態地,逐個字符地):
let input = "whateveridontneedthatfoodavidbarjennifer-andrew-billbazericfoojohnbarchristen"
*foo并bar出現兩次baz一次
我想以某種方式創建,也許是這樣的物件:
{
foo: ["david","john"],
bar: ["jennifer-andrew-bill","christen"],
baz: ["eric"]
}
或 3 個單獨的陣列,我并不真正關心結構,只要我正確過濾了值
uj5u.com熱心網友回復:
首先,構造一個正則運算式:
let regex = '('; // parenthesis is added for capturing groups, which means the flags will be captured too
for (f of flags) regex = f '|';
regex = new RegExp(regex.substring(0, regex.length - 1) ')', 'g'); // construct the regex with global flag
// regex = /(foo|bar|baz)/g
然后,拆分字串:
s = s.split(regex) // ["whateveridontneedthat", "foo", "david", "bar", "jennifer-andrew-bill", "baz", "eric", "foo", "john", "bar", "christen"]
最后,遍歷拆分的字串并將它們添加到物件中。
以下是完整示例:
let flags = ['foo', 'bar', 'baz'];
let s = "whateveridontneedthatfoodavidbarjennifer-andrew-billbazericfoojohnbarchristen";
let regex = '(';
let obj = {};
for (f of flags) regex = f '|';
regex = new RegExp(regex.substring(0, regex.length - 1) ')', 'g');
s = s.split(regex);
for (let i = 0; i < s.length; i ) {
for (let j = 0; j < flags.length; j ) { // checking for flags
if (s[i] == flags[j]) { // found the flag
if (flags[j] in obj) obj[flags[j]].push(s[i 1]); // array exist in object
else obj[flags[j]] = [s[i 1]]; // create array in object
i ; // skip next s[i]
break; // s[i] can only be one of the flag
}
}
}
console.log(obj);
uj5u.com熱心網友回復:
@Apple BS 的好答案,我只想提出以下語法:
const flags = ['foo', 'bar', 'baz']
const str = 'whateveridontneedthatfoodavidbarjennifer-andrew-billbazericfoojohnbarchristen'
const strSplit = str.split(new RegExp(`(${flags.join('|')})`, 'g'))
const obj = Object.fromEntries(flags.map(f => [f, []]))
strSplit.forEach((el, i) => {
if (flags.includes(el)) obj[el].push(strSplit[i 1])
})
console.log(obj)
uj5u.com熱心網友回復:
除了@AppleBS 和@Jean Will 的回答之外,
只需簡化 for 回圈。
const flags = ["foo", "bar", "baz"];
const str =
"whateveridontneedthatfoodavidbarjennifer-andrew-billbazericfoojohnbarchristen";
const strSplit = str.split(new RegExp(`(${flags.join("|")})`, "g"));
const output = strSplit.reduce((carry, item, idx, arr) => {
if (idx !== 0) {
if (idx % 2 === 0) carry[arr[idx - 1]].push(item);
else if (!carry[item]) carry[item] = [];
}
return carry;
}, {});
console.log(output);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/390121.html
標籤:javascript 数组 json 目的 ecmascript-6
上一篇:物件大小和C 標準
下一篇:如何將物件陣列轉換為物件物件
