Получить первый массив чисел в массиве переменной глубины

Я использую функцию в среде JavaScript, где возвращаемое значение может быть ЛЮБОЙ из следующего

  1. одна пара координат xy

    [x,y]
    
  2. массив пар координат xy

    [[x,y],[x,y],...]
    
  3. массив массивов координатных пар xy

    [[[x,y],[x,y]],[[x,y],[x,y]],...]
    

Возвращаемое значение зависит от геометрии объекта (одна точка, линия или несколько линий). Независимо от возвращаемого значения и глубины его массива, я хочу получить первую пару координат xy. Какой эффективный способ сделать это?

Вот мой код для достижения цели:

//here is the magic method that can return one of three things :)
var mysteryCoordinates = geometry.getCoordinates();
var firstCoord;

if(typeof mysteryCoordinates[0] === 'number') {
    firstCoord = mysteryCoordinates;
} else if (typeof mysteryCoordinates[0][0] === 'number') {
    firstCoord = mysteryCoordinates[0];
} else if (typeof mysteryCoordinates[0][0][0] === 'number') {
    firstCoord = mysteryCoordinates[0][0];
}

Я действительно ненавижу это решение и ищу что-то более элегантное.

7 голосов | спросил JellyRaptor 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2016 21:42:28 +0300 2016, 21:42:28

2 ответа


0

Я думаю, в чистом JS это должно быть сделано;

 var    arr = [[[1,2],[1,3]],[[4,8],[3,9]]],
getFirstXY = a => Array.isArray(a[0]) ? getFirstXY(a[0]) : a;

console.log(getFirstXY(arr));
ответил Redu 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2016 22:35:40 +0300 2016, 22:35:40
0

Менее эффективное, но более элегантное решение - использовать _.flatten ( http://underscorejs.org/#flatten ):

let firstCoord = _.flatten(mysteryCoordinates).slice(0, 2);

Вы могли бы сделать его немного более эффективным в среднем, предварительно отрезав первые два элемента:

let firstCoord = _.flatten(mysteryCoordinates.slice(0, 2)).slice(0, 2);

 console.log(_.flatten([1,2]).slice(0, 2));
console.log(_.flatten([[1,2],[1,3],[4,8],[3,9]]).slice(0, 2));
console.log(_.flatten([[[1,2],[1,3]],[[4,8],[3,9]]]).slice(0, 2));
 <script src="http://underscorejs.org/underscore-min.js"></script>
ответил Ben 28 thEurope/Moscowp30Europe/Moscow09bEurope/MoscowWed, 28 Sep 2016 21:51:17 +0300 2016, 21:51:17

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132