将字符串与分隔符连接起来的最高效方法是什么

时间:2017-11-09 07:03:03

标签: javascript algorithm string-concatenation

假设我需要实现一个简单的join函数,该函数接受一个数组并返回由分隔符分隔的连接元素串。 内置方法Array.prototype.join的种类。我所见过的所有实现都会在开头或结尾处产生一个冗余分隔符,因此需要修剪字符串。

例如,我可以这样做:

let s = "";
for (let i=0; i < arr.length; i++) s += sep + arr[i];
// redundant separator at the beginning, need to remove it
s = s.substr(1);

或者像这样:

let s = "";
for (let i=0; i < arr.length; i++) s += arr[i] + sep;
// redundant separator at the end, need to remove it
s = s.slice(0, -1);

有没有更好的方法不会产生冗余分隔符?导入该实现应该有效地处理所有情况,如空数组等。

我能想到的一种方法是在循环中放置if语句,检查它是否是第一个/最后一个元素,并且在这种情况下不添加分隔符,但是似乎效率低下。有什么想法吗?

5 个答案:

答案 0 :(得分:2)

let s = arr[0] || "";
for (let i=1; i < arr.length; i++) s += sep + arr[i];

添加第一个元素,在第二个元素开始循环,在前面添加分隔符。

正如您在问题中指出的那样,您可以使用条件仅在需要时附加分隔符,从而无需删除冗余分隔符。问题是,如果你加入两个或三个值可能是正确的,但是必须在每个循环迭代中进行测试对于大数组来说会变得很昂贵。

答案 1 :(得分:2)

对于第一个元素,您可以检查数组的长度并获取弦乐值或空字符串。

然后在answer正在做 Salketer 循环:

let s = arr.length && arr[0].toString() || '';
for (let i=1; i < arr.length; i++) s += sep + arr[i];

答案 2 :(得分:1)

如果您想自己定义,可以迭代到length- 1。在循环之后,您可以仅添加最后一项而不使用分隔符。

实施例

&#13;
&#13;
let arr = [1,2,3,4,5];
let sep = '-';

function customJoin(array, separator) {

   if(array.length === 0) {
      return '';
   }

   let s = '';
   let length = array.length;

   for (let i = 0; i < length - 1; i++) {
      s += arr[i] + separator;
   }

   return s + arr[length - 1];
}

console.log(customJoin(arr, sep));
&#13;
&#13;
&#13;

答案 3 :(得分:1)

使用reduce:

Task.Delay

答案 4 :(得分:0)

另一种可能的选择是使用递归:

function join(a, separator) {
    if (a.length === 0) return '';

    function concat(a, n) {
        return n > 0 ? concat(a, n - 1) + separator + a[n] : a[n];
    }
    return concat(a, a.length - 1);
}

一个限制是,由于调用堆栈大小限制,它无法处理数万个字符的大字符串。