Javascript 在与正则表达式匹配的元素处拆分数组

Javascript 在与正则表达式匹配的元素处拆分数组,javascript,arrays,regex,split,Javascript,Arrays,Regex,Split,我有这样一个数组: var a= ['--test--','some','someOther','--ts','som','someOthe','--t','so','someOth'] 我想把它分成3个数组 ['--test--','some','someOther'] ['--ts','som','someOthe'] ['--t','so','someOth'] 所以本质上我想在匹配条件str.indexOf('--')>-1 最有效的方法是什么 p.S:我用一个巨大的代码和奇怪的逻辑

我有这样一个数组:

var a= ['--test--','some','someOther','--ts','som','someOthe','--t','so','someOth']
我想把它分成3个数组

['--test--','some','someOther']
['--ts','som','someOthe']
['--t','so','someOth']
所以本质上我想在匹配条件
str.indexOf('--')>-1

最有效的方法是什么


p.S
:我用一个巨大的代码和奇怪的逻辑完成了它,但我正在寻找一个干净的方法来完成它。

@leu\m发布了一个更好的代码概括

var a=['--test--'、'some'、'somether'、'--ts'、'som'、'somether'、'--t'、'so'、'somether']
var结果=a.reduce((上一个、当前、idx)=>{
如果(!idx | | curren.startsWith(“--”){
上推送([当前])
}否则{
上推(上推().concat(当前))
}
返回上一个;
}, [])

console.log(result)
我是用forEach的
得出这个结论的:

var a=['-test--'、'some'、'somether'、'-ts'、'som'、'somether'、'-t'、'so'、'somether']
var-arr=[];
var tmp=[];
a、 forEach(函数(e){
如果(e.indexOf('--')==0){
如果(tmp.长度>0)
arr.push(tmp)
tmp=[]
}
tmp.push(e);
});
arr.push(tmp);

document.writeln(''+arr.join('\n')+'')修改了原始代码,因为它并非在所有情况下都有效

Edit2:返回到单个for循环:p

function *partition(array) {
  let tmp = [], i = 0;

  for (const e of array) {
    if (i++ && e.indexOf('--') >= 0) yield tmp, tmp = []; 
    tmp.push(e);
  }

  yield tmp;
}

console.log(...partition(['--test--','some','someOther','--ts','som','someOthe','--t','so','someOth']));
函数拆分(数组、模式){
var结果=[];
对于(变量x=0,y=0;x-1:true)和&x>y){
结果:推(a.slice(y,x));
y=x;
}
}
返回结果;
}
var a=[“tes--t”,“some”,“somether”,“--ts”,“som”,“somethe”,“--t”,“so”,“somether--”];
console.log(拆分(a,“-”);
功能解决方案:

var a=['-test--'、'some','somether','-ts','som','somether','-t','so','somether'];
函数拆分(数组、模式){
返回数组.reduce(函数(结果、元素、索引){
if(模式测试(元素)和索引){
结果:推送([元素]);
}否则{
结果[result.length-1]。推送(元素);
}
返回结果;
}, [[]]);
}
console.log(拆分(a,/--/);
console.log(拆分([],/-/);

log(拆分(['some','--test--'],/--/)这是一个基于生成器的解决方案,有点像@anubhava的:

function makePartitioner(startNew) {
  return function *(array) {
    let tmp = [], i = 0;

    for (const e of array) {
      if (i++ && startNew(e)) yield tmp, tmp = [];
      tmp.push(e);
    }

    yield tmp;
  };
}

var partitioner = makePartitioner(e => e.indexOf('--') >= 0);
console.log(...partitioner(['--a, 'b', '--c']));
我们还可以通过传递函数来概括新bucket何时启动的逻辑:

生成器方法具有以下优点:

  • 您可以传入任何iterable,而不仅仅是数组
  • 它可以处理输入流,甚至是无限的输入流


  • 投票赞成正确的答案吗?现在的for循环有什么问题吗?由于一些奇怪的原因,所有答案都被否决了。如果a的第一个条目不包含模式“-”,则会失败。恕我直言@leum,这从来不是挑战的一部分。你的解决方案在这里可能是最好的,你不应该去敲别人的“做工作”——特别是因为这不是“真正的”代码。我没有在这里否决任何人,除了一个已经删除的答案是完全错误的。这是最好的,因为它得到了@le_m ans的概括,使它对更广泛的受众有用。。所以接受这一点。但是,这正是我想要的。谢谢,请不要在没有投票的情况下否决答案explanation@NishanthMatha我同意。谢谢你,简单概括的版本请不要在没有投票的情况下否决答案explanation@NishanthMatha事实上,没有任何义务解释否决票(尽管我不是这个特殊案例中的否决票)。要求解释通常是浪费时间。如果投票人想要给出解释,他早就这么做了。那么在我的帖子中我的for循环的更新版本呢?还有,您使用什么来测试性能?@seahorspip这是因为您必须使用regex(自从OP将这个问题标记为“regex”)或indexOf()进行测试。我用正则表达式测试了你的循环。请不要在没有解释的情况下否决投票答案!使用
    map
    产生副作用而不是结果有什么特别的原因吗?是的
    forEach
    map
    更好(编辑)最有效的方法是什么?通常,“高效”指的是绩效。你是特别对性能感兴趣,还是说“紧凑”或“优雅”或“可理解”或其他什么?我指的是性能。。。因为这是一个js代码,即使字节大小在这里也很重要,它将在客户端呈现。感谢您,“字节大小”与“性能”不同,尽管它是性能的一个要素。通常,“绩效”应解释为“执行绩效”。如果这是您感兴趣的,那么公认的答案是错误的,因为
    reduce
    比简单的
    for
    循环要慢,谢谢,您能为您的索赔提供一些参考吗?(for和reduce)在我的上一条评论中说“偶数字节大小”,这意味着我知道还有其他的性能元素,例如指向另一个方向的Ks,将仔细研究
    生成器
    函数
    function makePartitioner(startNew) {
      return function *(array) {
        let tmp = [], i = 0;
    
        for (const e of array) {
          if (i++ && startNew(e)) yield tmp, tmp = [];
          tmp.push(e);
        }
    
        yield tmp;
      };
    }
    
    var partitioner = makePartitioner(e => e.indexOf('--') >= 0);
    console.log(...partitioner(['--a, 'b', '--c']));