【问题标题】:JavaScript split string by comma and character countJavaScript 按逗号和字符数拆分字符串
【发布时间】:2017-02-03 15:45:32
【问题描述】:

我有一个包含大约 10,000 个 id 逗号分隔的字符串,我想用逗号分隔它们,并确保每个字符串中的字符数不超过 1500 个字符。

例如:

var str = "12345, 567789, 435345, 55446444564, 786756, 33322 .... ";
var commaSeperatedSplitArr = str.split(",");
var arrayOfArrays = [];
var limit = 50;

// So, I would like to get my commaSeperatedSplitArr[0].length >= 1500 and <= 1600 characters such that none of the Ids are cropped off    
while(commaSeperatedSplitArr.length > 0) {
    var splicedCharCount = arrayOfEmails.splice(0, limit)[0].length;
    if(splicedCharCount >= 1500 && splicedCharCount <= 1600) {
        arrayOfArrays.push(commaSeperatedSplitArr.splice(0, limit));  
    }
}

实现这一目标的最佳方法是什么?我试过使用 str.splice(0, limit) 但这只是给我限制的计数而不是我想要的字符数。

更新:

另外,我们如何使用上面的方法来申请一个电子邮件地址列表?

For E.g.: var str = "abc@gmail.com, xyz@help-desk.com, hello@world.com.... "

预期结果: 1) 对于 ID:(如果限制为 50 个字符)

arrayOfArrays[0] = "12345, 567789, ... "; (should contain 50 characters or less without any id being cropped off.)

2) 对于电子邮件地址:(如果限制为 50 个字符)

arrayofArrays[0] = "abc@gmail.com, xyz@help-desk.com,..."; (should contain 50 characters or less without any email address being cropped off.)

期待你们的解决方案。 干杯。

【问题讨论】:

  • 那么一个 id 可以有超过 1500 个字符?
  • 不是真的,但它只是我想要跟踪的字符数,因为我试图将其拆分为数组数组。
  • 如果超过 1500,你会怎么做,干脆不将它们添加到数组中?
  • 所以你的意思是你需要把它分成id数组,每个数组不超过1500个字符?而且你不想切断数组之间的id?
  • @TheNewbie 好的等等...给我们一个您希望与您发布的代码相关的结果示例。

标签: javascript jquery arrays string split


【解决方案1】:

使用正则表达式的单行解决方案。

它用管道改变字符串的第一个字符之前的最后一个逗号,一直这样做直到字符串的末尾。然后在管道上分裂。

var str = "12345, 567789, 435345, 55446444564, 786756, 33322, 12345, 567789, 435345, 55446444564, 786756, 33322, 12345, 567789, 435345, 55446444564, 786756, 33322"
var limit = 20;

var regex = new RegExp(`([^]{1,${limit}})(, |$)`, "g");
var out = str.replace(regex, "|$1").slice(1).split("|")

console.log(out.map(l => `"${l}"\t\t(size: ${l.length})`).join("\n"))

编辑

这是一个没有模板文字以支持旧浏览器的示例

var str = "12345, 567789, 435345, 55446444564, 786756, 33322, 12345, 567789, 435345, 55446444564, 786756, 33322, 12345, 567789, 435345, 55446444564, 786756, 33322"
    var limit = 20;

    var regex = new RegExp('([^]{1,' + limit + '})(, |$)', "g");
    var out = str.replace(regex, "|$1").slice(1).split("|")

    console.log(out.map(l => '"'+l+'"\t\t(size: '+l.length+')').join("\n"))

【讨论】:

  • IE 不接受 ` 作为有效字符。我们该如何解决这个问题?
  • 我用一个应该在 IE 中运行的示例更新了答案
  • 它似乎不起作用。我将 1500 作为我的字符数限制,但它似乎没有考虑到这一点......它仍然将所有内容推入 [0]。
  • str 的长度是多少?
  • 我认为你应该先澄清这个问题,因为 ids 格式在这里应该不是问题。给我们一个合理的输入和预期输出的例子,然后我就能解决问题
【解决方案2】:

尝试以下方法:

var str = "12345, 567789, 435345, 55446444564, 786756, 33322";
var commaSeparatedSplitArr = str.split(", ");
var arrayOfArrays = [];
var currentArrayCharCount = 0;
var currentArray = [];
var arrayCharCountLimit = 10;
for (var i = 0; i < commaSeparatedSplitArr.length; i++) {
  var currentId = commaSeparatedSplitArr[i];
  if (currentArrayCharCount + currentId.length > arrayCharCountLimit) {
    arrayOfArrays.push(currentArray);
    currentArray = [];
    currentArrayCharCount = 0;
    if (currentId.length <= arrayCharCountLimit) {
      currentArray.push(currentId);
      currentArrayCharCount += currentId.length;
    } else {
      console.error("ID: " + currentId + " is too long!");
    }
  } else {
    currentArray.push(currentId);
    currentArrayCharCount += currentId.length;
  }
}
arrayOfArrays.push(currentArray);
console.log(arrayOfArrays);

此外,如果您的字符串中实际上存在空格,您可能需要考虑将拆分字符更改为 ", "(包括空格),这样 id 的开头就不会全部包含空格。

编辑:进行了一些更正并转换为堆栈 sn-p。

【讨论】:

  • 对不起@Andrew。这不起作用,它只返回与我之前相同的拆分数组。
  • 其实,如果我们不使用 splice(),你的方法效果很好。
猜你喜欢
  • 2017-01-05
  • 2017-08-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多