【问题标题】:Get first array of numbers in array of variable depth获取可变深度数组中的第一个数字数组
【发布时间】:2017-02-06 21:29:56
【问题描述】:

我在 JavaScript 框架中使用一个函数,其中返回值可以是以下 ANY

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

我真的很讨厌这种解决方案,并且正在寻找更优雅的解决方案。

【问题讨论】:

  • geometry 对象是否没有一些属性可以告诉您它所代表的几何类型,即点、线、线?
  • 我要获取第一个 xy 坐标对你只对第一对感兴趣吗?或者稍后您可能还想要一些其他索引数据?
  • @PatrickEvans 确实如此,但我必须对几何对象进行三个单独的 typeof 检查才能知道访问第一个坐标对的正确深度。
  • @Reddy 是的,我只对第一对感兴趣。

标签: javascript arrays multidimensional-array


【解决方案1】:

我猜在纯 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));

【讨论】:

  • 你不需要连接。
  • @Nina Scholz 酷..!谢谢:)
  • @Redu 这适用于所有 3 个场景。想解释一下发生了什么?
  • @JellyRaptor getFirstXY 是一个递归函数。它检查提供的数组的第一项,如果它是一个数组,则再次调用getFirstXY,其中 a[0] 是参数,直到它不是,然后返回参数数组。
  • @Redu 这太棒了。回答接受。谢谢!
【解决方案2】:

一个效率较低但更优雅的解决方案是使用_.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>

【讨论】:

  • 经过进一步审查,此解决方案仅适用于场景 1 和 2,但不适用于场景 3。当输入是对数组的数组时,它会输出一个对数组。
  • 似乎对我有用最新版本的下划线。也许您不小心为shallow 传递了一个真实值?
  • +1 用于演示功能。我最初使用最新 lodash 版本的 flatten() 函数检查了结果。我认为它相当于下划线的扁平化,但显然不是。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
相关资源
最近更新 更多