将坐标数组展平为单个数组

时间:2013-11-07 23:44:51

标签: javascript

我已经看到关于flattening arrays one level的这个不成功的问题。不确定此查询是否属于同一个洞。我想知道这对于一系列坐标是否可行。 e.g。

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用于完整的点列表。感谢任何提示。

3 个答案:

答案 0 :(得分: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已经是一个数组数组,所以我们很高兴来到这里。

答案 1 :(得分:2)

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

var singlearray = [].concat.apply([], arraysections);
  1. Concat接受多个数组进行连接。
  2. Apply接受参数数组作为第二个参数。
  3. 这允许将所有内容传递到concat而不迭代 arraysections

答案 2 :(得分: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);