2016-09-28 109 views
7

的數組編號的第一陣列我正在使用一個javascript框架的方法,其中所述返回值可以是以下獲取可變深度

  1. 單個XY的ANY座標對

    [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]; 
} 

我真的很討厭這個解決方案,並正在尋找的東西多一點優雅。

+2

是否'geometry'對象沒有的一些特性告訴你它代表什麼類型的幾何形狀,即點,線,線? –

+1

__我想抓住第一個xy座標對___你只對第一對有興趣?或者稍後您可能還需要其他一些索引數據? –

+0

@PatrickEvans它的確如此,但我必須對幾何對象進行三次單獨的檢查,以瞭解訪問第一個座標對的適當深度。 – JellyRaptor

回答

4

我想在純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));

+1

你不需要concat。 –

+1

@Nina Scholz酷..!謝謝:) – Redu

+0

@Redu這適用於所有3場景。小心解釋發生了什麼? – JellyRaptor

2

效率較低,但更優雅的解決方案是使用_.flattenhttp://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>

+0

經過進一步檢查,此解決方案僅適用於方案1和2,但不適用於3.當輸入是對數組數組時,它會吐出一組數組。 – JellyRaptor

+0

似乎爲我使用最新版本的下劃線。也許你不小心通過了「淺」的真值? – Ben

+0

+1用於演示功能。我最初使用最新lodash版本的flatten()函數檢查結果。我推測這相當於下劃線的扁平化,但顯然它不是。 – JellyRaptor