JavaScript 用点符号对变量进行连续的 split()
JavaScript successive split() on variables with dot notation
我有这个变量:
var myVar = "r.object.subobject.variable";
我想将此字符串的每个 "levels" 添加到一个数组中。我的数组将包含:
"r.object"
"r.object.subobject"
"r.object.subobject.variable"
我知道我可以将 JavaScript 的 split() 函数与 RegEx 一起使用,但我使用的函数一直返回整个字符串。例如,我正在尝试:
var myArray = myVar.split(/r[.].+/);
因此,myArray[0]
始终显示为 "r.object.subobject.variable"
。
如何制作 myArray[0] = "r.object"
、myArray[1] = "r.object.subobject"
和 myArray[2] = "r.object.subobject.variable"
?
希望我只是误解了正则表达式的工作原理,而不是需要通过仅分隔句点来进行某种人为的递归或数组连接。
其他约束和背景信息
- 我正在检查的变量的深度可能从 1 到未知数,因此任何函数都应尝试确定要提取的字符串数量。所有字符串将始终以
r.
开头(我为此设置了一个 while 循环,尽管它可以正确匹配给定的深度,但拆分仍然失败。)
- 此操作将在数千或数万个字符串上进行,因此速度很重要。
- 我知道括号表示法是一回事,但我不能将其用于我的目的。 (数组元素最终会返回到一个专门的 AS3 应用程序中,该应用程序并不总是能很好地使用它。)
实际上,myArray[0]
应该 return 一个空字符串。表达式 /r[.].+/
匹配整个字符串,因此 return 匹配匹配前后的所有内容(空字符串)。注意 .+
匹配任何重复一次或多次的字符:
r.object.subobject.variable
--^ ^ [1]: matched by r[.]
1 | 2 |
+------------------------ [2]: matched my .+
如果要按点拆分 (".
"),请使用:
var myArray = myVar.split(/[.]/);
编辑至于更新的问题,正则表达式只能匹配文本的一部分一次。
要实现您的目标,应执行以下代码:
var myVar = "r.object.subobject.variable";
var mySplit = myVar.split(".");
var myArray = Array();
for (i = 2; i <= mySplit.length; i++) {
myArray.push(mySplit.slice(0,i).join("."));
}
document.write(myArray);
尝试将 .split()
与 RegExp
/\./
、do.. while
循环、Array.prototype.slice()
、Array.prototype.join()
、Array.prototype.splice()
[= 一起使用18=]
var myVar = "r.object.subobject.variable";
var arr = myVar.split(/\./),
len = arr.length,
i = 0,
myArray = [];
do {
myArray.push(arr.slice(0, i).join("."));
++i;
} while (myArray.length <= len);
myArray.splice(0, 2);
console.log(myArray);
我不认为你可以像使用正则表达式那样获得很好的平衡,也许如果 javasacript 支持 (?R) 但似乎不支持的话。你可以把它按点分开然后连接起来。
function levels(str) {
var levels;
return str.split('.').reduce(function(acc, level, index) {
if(index > 0) {
levels = levels + '.' + level
acc.push(levels);
} else {
levels = level;
}
return acc;
}, []);
}
document.getElementById('results').innerHTML = JSON.stringify(levels('r.object.subobject.variable'), null, '\t');
<pre id="results"></pre>
我有这个变量:
var myVar = "r.object.subobject.variable";
我想将此字符串的每个 "levels" 添加到一个数组中。我的数组将包含:
"r.object"
"r.object.subobject"
"r.object.subobject.variable"
我知道我可以将 JavaScript 的 split() 函数与 RegEx 一起使用,但我使用的函数一直返回整个字符串。例如,我正在尝试:
var myArray = myVar.split(/r[.].+/);
因此,myArray[0]
始终显示为 "r.object.subobject.variable"
。
如何制作 myArray[0] = "r.object"
、myArray[1] = "r.object.subobject"
和 myArray[2] = "r.object.subobject.variable"
?
希望我只是误解了正则表达式的工作原理,而不是需要通过仅分隔句点来进行某种人为的递归或数组连接。
其他约束和背景信息
- 我正在检查的变量的深度可能从 1 到未知数,因此任何函数都应尝试确定要提取的字符串数量。所有字符串将始终以
r.
开头(我为此设置了一个 while 循环,尽管它可以正确匹配给定的深度,但拆分仍然失败。) - 此操作将在数千或数万个字符串上进行,因此速度很重要。
- 我知道括号表示法是一回事,但我不能将其用于我的目的。 (数组元素最终会返回到一个专门的 AS3 应用程序中,该应用程序并不总是能很好地使用它。)
实际上,myArray[0]
应该 return 一个空字符串。表达式 /r[.].+/
匹配整个字符串,因此 return 匹配匹配前后的所有内容(空字符串)。注意 .+
匹配任何重复一次或多次的字符:
r.object.subobject.variable
--^ ^ [1]: matched by r[.]
1 | 2 |
+------------------------ [2]: matched my .+
如果要按点拆分 (".
"),请使用:
var myArray = myVar.split(/[.]/);
编辑至于更新的问题,正则表达式只能匹配文本的一部分一次。
要实现您的目标,应执行以下代码:
var myVar = "r.object.subobject.variable";
var mySplit = myVar.split(".");
var myArray = Array();
for (i = 2; i <= mySplit.length; i++) {
myArray.push(mySplit.slice(0,i).join("."));
}
document.write(myArray);
尝试将 .split()
与 RegExp
/\./
、do.. while
循环、Array.prototype.slice()
、Array.prototype.join()
、Array.prototype.splice()
[= 一起使用18=]
var myVar = "r.object.subobject.variable";
var arr = myVar.split(/\./),
len = arr.length,
i = 0,
myArray = [];
do {
myArray.push(arr.slice(0, i).join("."));
++i;
} while (myArray.length <= len);
myArray.splice(0, 2);
console.log(myArray);
我不认为你可以像使用正则表达式那样获得很好的平衡,也许如果 javasacript 支持 (?R) 但似乎不支持的话。你可以把它按点分开然后连接起来。
function levels(str) {
var levels;
return str.split('.').reduce(function(acc, level, index) {
if(index > 0) {
levels = levels + '.' + level
acc.push(levels);
} else {
levels = level;
}
return acc;
}, []);
}
document.getElementById('results').innerHTML = JSON.stringify(levels('r.object.subobject.variable'), null, '\t');
<pre id="results"></pre>