我需要一个函数,它可以从一个可能包含任意数量数组的数组中返回一个值。它应该像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。我猜它是因为递归,变量获取在第一次函数调用期间未定义的值。如何解决这个问题?
谢谢!
答案 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]
的方法,但我现在想不出办法,我认为不可能。