1

我已经看到了这个关于将数组展平一层的不成功的 SO 问题。不确定这个查询是否落入同一个洞。我想知道这对于坐标数组是否可行。例如

var arraysections = [[
  [480, 200],
  [580, 400],
  [680, 100]
],
 [[680, 100],
  [180, 300],
  [280, 100],
  [380, 400]
]];

成为..

var singlearray = [
  [480, 200],
  [580, 400],
  [680, 100],
  [680, 100],
  [180, 300],
  [280, 100],
  [380, 400]
];

我需要arraysections单独的路径和singlearray完整的点列表。感谢任何提示。

4

3 回答 3

4

还是一样。您可以使用concat合并多个数组。您可以通过遍历对象以手动方式执行此操作:

var singlearray = [];
for (var i = 0; i < arraysections.length; i++) {
    singlearray = singlearray.concat(arraysections[i]);
}

或者使用以下花哨的方式apply

var singlearray = Array.prototype.concat.apply([], arraysections);

后者基本上通过调用[].concat(arraysections[0], arraysections[1], ...). 的第一个参数apply是您使用的数组对象this(这里可以是空数组),第二个参数是传递给concat. 由于 concat 可以一次组合多个数组,并且arraysections已经是数组数组,所以我们很高兴来到这里。

于 2013-11-07T23:49:22.610 回答
2

这很简单,您只需执行以下操作:

var singlearray = [].concat.apply([], arraysections);
  1. Concat 接受多个数组进行连接。
  2. Apply 接受参数数组作为第二个参数。

这允许在不迭代arraysections的情况下将所有的传递到 concat 中。

于 2013-11-07T23:51:38.403 回答
1

优化@poke 的答案。使用reduce()优化对 for 循环的需求,即

var arraysections = [[
  [480, 200],
  [580, 400],
  [680, 100]
],
 [[680, 100],
  [180, 300],
  [280, 100],
  [380, 400]
]];
var singlearray = arraysections.reduce( function(p, c) {
    return p.concat(c);
} );
console.log(singlearray);

或者,考虑使用forEach()将昂贵的concat()调用替换为更便宜的push()调用:

var arraysections = [[
  [480, 200],
  [580, 400],
  [680, 100]
],
 [[680, 100],
  [180, 300],
  [280, 100],
  [380, 400]
]];
var singlearray = [ ];
arraysections.forEach(function(e) {
    Array.prototype.push.apply(singlearray, e);
} );
console.log(singlearray);

于 2016-02-22T00:22:41.603 回答