假设我需要实现一个简单的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
语句,检查它是否是第一个/最后一个元素,并且在这种情况下不添加分隔符,但是似乎效率低下。有什么想法吗?
答案 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
。在循环之后,您可以仅添加最后一项而不使用分隔符。
实施例
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;
答案 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);
}
一个限制是,由于调用堆栈大小限制,它无法处理数万个字符的大字符串。