2013-11-07 3 views
1

Я видел этот неуспешный вопрос SO о flattening arrays one level. Не уверен, что этот запрос попадает в одно отверстие. Интересно, возможно ли это для массива координат. напримерСглаживание массивов координат до одного массива

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 для полного списка точек. Благодарен за любые советы.

+0

Я знаю, что это не отвечает на ваши вопросы, но в последнее время я использую подчеркивание и считаю это очень полезным для таких случаев: http://underscorejs.org/#flatten – Malk

+0

tvm guys. Отметьте, чтобы @poke для первого ответа и полноты, но вы оба на кнопке. – geotheory

ответ

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 уже представляет собой массив массивов, мы будем рады здесь.

2

Это легко, просто сделайте следующее:

var singlearray = [].concat.apply([], arraysections); 
  1. Concat принимает несколько массивов для конкатенации.
  2. Применить Принимает массив аргументов в качестве второго аргумента.

Это позволяет передать все ваши в CONCAT без итерация arraysections.

1

Оптимизация ответа @ poke. Оптимизировать на необходимость для цикла с помощью reduce(), т.е.

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);

Смежные вопросы