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"

希望我只是误解了正则表达式的工作原理,而不是需要通过仅分隔句点来进行某种人为的递归或数组连接。

其他约束和背景信息

实际上,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>