【问题标题】:Split a JavaScript string into fixed-length pieces将 JavaScript 字符串拆分为固定长度的片段
【发布时间】:2012-05-15 13:01:07
【问题描述】:

我想将一个字符串分割成固定长度(例如N)的片段。当然,如果原始字符串的长度不是N的倍数,最后一段可以更短。

我需要最快的方法来做到这一点,但也是最简单的写法。到目前为止,我一直这样做的方式如下:

var a = 'aaaabbbbccccee';
var b = [];
for(var i = 4; i < a.length; i += 4){ // length 4, for example
    b.push(a.slice(i-4, i));
}
b.push(a.slice(a.length - (4 - a.length % 4))); // last fragment

我认为必须有更好的方法来做我想做的事。但我不想要额外的模块或库,如果可能的话,只需要简单的 JavaScript。

在询问之前,我已经看到了一些使用其他语言解决此问题的解决方案,但它们在设计时并未考虑到 JavaScript。

【问题讨论】:

  • 你真的每次都写出来只是为了避免函数调用吗?
  • 是什么让您认为您可以拥有最快的代码执行简单的实现?这两种品质经常相互竞争。
  • 这是另一个实现,但仍然与您的非常相似:phpjs.org/functions/str_split:530
  • @Esailija 他在什么地方说的? @sgmonda 我认为没有更好的方法。由于 javascript string 没有执行此操作的方法,因此您拥有的几行代码就可以了。这也应该足够快。
  • 尝试使用String.substringString.substr 代替String.slice 并比较性能。

标签: javascript html node.js


【解决方案1】:

你可以试试这个:

var a = 'aaaabbbbccccee';
var b = a.match(/(.{1,4})/g);

【讨论】:

  • 非常简单!我喜欢!但是,例如,如果固定长度为 32 会发生什么?我必须写/(.{32}|.{31}|.{30}...|.{2}|.)/g。太文字了!
  • 更短:a.match(/(.{1,4})/g);
  • 我可能会使用[\S\s] 或类似.,因为它包含每个字符
  • 完美,@Niko!正是我想要的。
  • 抱歉各位,我之前尝试过编辑这篇文章并写出与@Niko 相同的想法,但我不知道为什么,我做不到
【解决方案2】:

请参阅此相关问题:https://stackoverflow.com/a/10456644/711085https://stackoverflow.com/a/8495740/711085(如果性能有问题,请参阅 cmets 中的性能测试。)

第一个(较慢的)链接:

[].concat.apply([],
    a.split('').map(function(x,i){ return i%4 ? [] : a.slice(i,i+4) })
)

作为字符串原型:

String.prototype.chunk = function(size) {
    return [].concat.apply([],
        this.split('').map(function(x,i){ return i%size ? [] : this.slice(i,i+size) }, this)
    )
}

演示:

> '123412341234123412'.chunk(4)
["1234", "1234", "1234", "1234", "12"]

【讨论】:

  • 现在正则表达式的答案不需要写/(.{32}|.{31}|.{30}............................|.{2}|.)/g,我不得不推荐这个答案,因为它非常简洁。 =) 此解决方案仅适用于分块数组。
  • 这似乎非常适合同样的问题,但适用于数组。谢谢!对于拆分字符串,我更喜欢上述解决方案。
  • @FelixKling:啊有趣。尽管人们不应该通过测试来暗示(可能是错误的) Array.concat 很慢。最可能的罪魁祸首是 1) 转换为数组(可通过在准备代码中执行 .split('') 进行测试),以及 2) 执行不必要的 4x if 语句。尽管如此,for-loop 版本肯定会更有效。我不确定我应该链接两个答案中的哪一个。谢谢,我会编辑指出这一点。
【解决方案3】:
function stringToChanks(string, chunkSize) {
    const chunks = [];
    while (string.length > 0) {
        chunks.push(string.substring(0, chunkSize));
        string = string.substring(chunkSize, string.length);
    }
    return chunks
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-29
    • 1970-01-01
    • 2015-03-12
    • 2015-05-02
    • 1970-01-01
    相关资源
    最近更新 更多