我怎样才能真正理解'Array.prototype.join'的方法

时间:2019-04-03 07:44:10

标签: javascript arrays multidimensional-array

我将Array.prototype.join的方法用于多维数组,但是得到了奇怪的结果。我尝试查看Array.prototype.join的底部实现,它向我展示了本机代码

[1,2,3,4,5,6,7,8].join('')
[1, [2], [3, [4, [5]]], [6, [7, [8]]]].join('');

我希望

的输出
[1,[2],[3,[4,[5]]],[6,[7,[8]]]].join('') 

成为

12345678

但实际输出是

123,4,56,7,8

3 个答案:

答案 0 :(得分:4)

.join在每个元素上调用.toString()将其转换为字符串,并且Array.prototype.toString()默认将其所有元素与,连接起来。

console.log([1, 2, 3].toString());

答案 1 :(得分:2)

就像其他人已经说过的一样, toString 在数组上被调用。但是,通过提供分隔符,它将仅连接使用该分隔符在其上调用方法的数组。

[
  1, 
  [2], 
  [3, [4, [5]]], 
  [6, [7, [8]]]
].join("")

只需将第一级元素连接在一起,对不是字符串的元素调用 toString

1.toString() + "" +
 [2].toString() + "" +
 [3, [4, [5]]].toString() + "" +
 [6, [7, [8]]].toString()

其中""是分隔符。结果为123,4,56,7,8,其中3,4,5是第一个嵌套数组,6,7,8是第二个嵌套数组(具有多个元素)。如果您想加入递归元素,则可以创建自己的方法。

Array.prototype.deepJoin = function (separator) {
  return this
    .map(e => Array.isArray(e) ? e.deepJoin(separator) : e)
    .join(separator);
};

var array = [1, [2], [3, [4, [5]]], [6, [7, [8]]]];

console.log(array.join());
console.log(array.deepJoin());
console.log(array.join(""));
console.log(array.deepJoin(""));
console.log(array.join(" - "));
console.log(array.deepJoin(" - "));

答案 2 :(得分:1)

join方法还会在每个元素上调用toString()

你有

[2].toString() -> 2
[3, [4, 5]].toString() -> 3,4,5

以此类推。数组从不上的toString方法保留方括号