在JavaScript中解析数组数组

时间:2015-04-15 18:30:57

标签: javascript arrays parsing recursion

我需要一个函数,它可以从一个可能包含任意数量数组的数组中返回一个值。它应该像getValueFromArray(array,[2,4])一样调用 - 这个例子应该返回传递数组的2d数组的第4个元素。

这是我的代码:

function getValueFromArray(arr, indexes){

var val,
    currentIndex = indexes[0];

    if(!arr[currentIndex] || arr[currentIndex] === '') return value = '';

    indexes.splice(0, 1);

    if(arr[currentIndex].length) 
        getValueFromArray(arr[currentIndex], indexes);
    else {
        val = arr[currentIndex];
        return val;
    }
 }


      var y = getValueFromArray([[1,2,3,4], [1,2,3,4]], [0, 2]); // should return 3

      var x = getValueFromArray([[1,2,3,4], [1,2,3,4], [5,6,7,8]], [2, 3]); // should return 8

      var z = getValueFromArray(
                           [
                               [[1,2,3,4], [1,2,3,4], [1,2,3,4]],
                               [[1,2,3,4], [1,2,3,4]]
                           ], 
                           [0, 1, 2]
                          ); // should return 3

这样的调用应该返回3,如果我调试函数,它实际上返回正确的值但是当我将它分配给变量时,它返回undefined。我猜它是因为递归,变量获取在第一次函数调用期间未定义的值。如何解决这个问题?

谢谢!

8 个答案:

答案 0 :(得分:1)

您没有返回递归结果。

if(arr[currentIndex].length) 
    getValueFromArray(arr[currentIndex], indexes);

应该是:

if(arr[currentIndex].length) 
    return getValueFromArray(arr[currentIndex], indexes);

答案 1 :(得分:0)

你错过了代码中的一件事(在条件之后返回结果)尝试下面给出的代码: -

function getValueFromArray(arr, indexes){

    var val,
        currentIndex = indexes[0];

        if(!arr[currentIndex] || arr[currentIndex] === '') return value = '';

        indexes.splice(0, 1);

        if(arr[currentIndex].length) 
           return getValueFromArray(arr[currentIndex], indexes);
        else {
            val = arr[currentIndex];
            return val;
        }
     }
    var y = getValueFromArray([[1,2,3,4], [1,2,3,4]], [0, 2]);
    console.log(y)

运行它并查看,现在它将结果显示在变量中。

答案 2 :(得分:0)

你的猜测是正确的。您只是忘记了return递归调用返回的内容:

if(arr[currentIndex].length) 
    getValueFromArray(arr[currentIndex], indexes); // <---- here

话虽如此,我必须同意你可以更简洁地做到这一点(这最终会破坏indexes):

function getValueFromArray(arr, indexes){
  while(indexes.length) arr=arr[indexes.shift()]
  return arr
}

答案 3 :(得分:0)

我认为您需要先添加退货 getValueFromArray(arr [currentIndex],索引);
使每个递归调用返回时,使最终计算值递归递归方法调用堆栈。

答案 4 :(得分:0)

这是因为如果条件没有返回任何值。 尝试以下代码

function getValueFromArray(arr, indexes){

var val='',currentIndex = indexes[0];

    if(!arr[currentIndex] || arr[currentIndex] === '') return val;

    indexes.splice(0, 1);

    if(arr[currentIndex].length) {

       // Because if your function walks this way 
       // it does not meet any 'return' statement
       // till the end and returns nothing.
        return getValueFromArray(arr[currentIndex], indexes);
    }   
    else { 
        val = arr[currentIndex];
        return val;
    }
 }

然后控制台记录您的变量

var y = getValueFromArray([[1,2,3,4], [1,2,3,4]], [0, 2]);
console.log(y)

答案 5 :(得分:0)

我也会发布我的代码,因为我认为它可以为您的问题提供更简单的解决方案 没有涉及递归,所以它理论上应该运行得快一点。

var arr = [
  [
    [
      [12, 5, 6],
      [ 6, 7, 8],
      [11, 0, 9]
    ],
    [
      [-1, 1, 8],
      [ 4, 5, 6]
    ]
  ],
  [
    [
        [7, 8, 9, 10]
    ]
  ]
];

function getValueFromArray(arr, indexes){
    var value = arr, i = 0, len = indexes.length, index = null;

    for (; i < len; i += 1) {
        index = indexes[i];
        // check if the current array contains an {index}-th record
        if ( index in value ) { 
            value = value[index];
        } else {
            // or throw an exception if you want
            return null;
        }
    }

    return value;
 }

getValueFromArray(arr, [0, 1, 1, 2]) // 6

答案 6 :(得分:0)

function getValueFromArray(arr, indexes) {
    // exit if arr is not an array
    // exit if arr is empty
    // exit if indexes is not an array
    // exit if indexes is empty
    if (!Array.isArray(arr) || !arr.length || !Array.isArray(indexes) || !indexes.length) {
        return; // may throw exception or return other value
    }
    var currentIndex = indexes.shift();
    // exit if index is not in arr
    // exit if index is negative
    if (arr.length <= currentIndex || currentIndex < 0) {
        return; // may throw exception or return other value
    }
    return Array.isArray(arr[currentIndex]) ? getValueFromArray(arr[currentIndex], indexes) : arr[currentIndex];
}

答案 7 :(得分:-1)

你正在思考这个:

function getValueFromArray(arr, indexes){
    return arr[indexes[0]][indexes[1]];
}

编辑1到3维数组:

function getValueFromArray(arr, indexes){
    if (indexes.length == 1) {
        return arr[indexes[0]];
    } else if (indexes.length == 2) {
        return arr[indexes[0][indexes[1]];
    } else if (indexes.length == 3) {
        return arr[indexes[0][indexes[1][indexes[2]];
    } else {
      // 4 dimensional arrays???
    }
}

你有超过三维数组吗?

最好找一种追加indexes[i]的方法,但我现在想不出办法,我认为不可能。