使用数组作为嵌套数组的键?

Use array as keys for nested array?

提问人:John Smith 提问时间:10/4/2022 更新时间:10/4/2022 访问量:154

问:

我有一个如下所示的嵌套数组。

var arr1 = ['a', 'b', ['c', 'd'], ['e', 'f']];

有没有办法使用另一个未嵌套的数组作为 的键?arr1

var arr1 = ['a', 'b', ['c', 'd'], ['e', 'f']];
var arr2 = [3, 0];
var arr3 = [4, 1];

console.log(arr1[arr2]); // should return 'c' like arr1[3][0]
console.log(arr1[arr3]); // instead of arr1[4][1]; should return 'f'

有没有一个功能可以让我这样做?

JavaScript 数组 多维数组 嵌套 嵌套列表

评论

0赞 justanotherguy 10/4/2022
看看 lodash 函数,我认为它可能接近您要找的。lodash.com/docs/4.17.15#getget
0赞 epascarello 10/4/2022
没有什么内置的东西可以做你所追求的,你需要对它进行编码。
0赞 James 10/4/2022
const c = arr2.reduce((acc, el) => acc[el], arr1);-> 返回“e”,因为索引 3 有“e”、“f”
0赞 PeterKA 10/4/2022
我认为应该是而且应该是.你可以编写一个函数来做到这一点。arr2[2, 0]arr3[3,1]
0赞 Mister Jojo 10/4/2022
[3, 0]应该返回,而不是,应该返回......ec[4, 1]undefined

答:

1赞 JRose 10/4/2022 #1

您可以创建自己的函数来实现此行为,如下所示:

function nested_access(arr1, arr2) {
    let ret = arr1;
    arr2.forEach((index) => {
        ret = ret[index];
    });
    return ret;
}

const arr1 = ['a', 'b', ['c', 'd'], ['e', 'f']];
const arr2 = [2, 0];
const arr3 = [3, 1];

console.log(nested_access(arr1, arr2)); // should return 'c'
console.log(nested_access(arr1, arr3)); // should return 'f'

0赞 epascarello 10/4/2022 #2

只是一个简单的方法,减少走树。(我更改了您的示例索引,因为它们已关闭)

const lookUp = (arr, indexes) =>
  indexes.reduce(
    (acc, index) => acc[index],
    arr);


var arr1 = ['a', 'b', ['c', 'd'],
  ['e', 'f']
];
var arr2 = [2, 0];
var arr3 = [3, 1];

console.log(lookUp(arr1, arr2));
console.log(lookUp(arr1, arr3));

0赞 jsejcksn 10/4/2022 #3

可以通过使用属性访问器数组迭代访问属性来查找值:

function findValue (obj, propertyAccessors) {
  try {
    let result = obj;
    for (const key of propertyAccessors) result = result[key];
    return result;
  }
  catch {
    return undefined;
  }
}

const arr1 = ['a', 'b', ['c', 'd'], ['e', 'f']];
const arr2 = [2, 0];
const arr3 = [3, 1];

console.log(findValue(arr1, arr2)); // "c"
console.log(findValue(arr1, arr3)); // "f"
console.log(findValue(arr1, [2, 2, 3])); // undefined

如果尝试访问不存在的属性,则结果将为 。如果继续尝试访问 上的另一个属性,则会引发异常。通过使用 try...catch,你可以捕获这样的错误并返回.undefinedundefinedundefined

0赞 Jose Marin 10/4/2022 #4

试试这个:

function getValue(arr, arrKeys)
{
  return arrKeys.reduce(
    (acum, current) =>  acum?.[current]
    , arr
  )
}

var arr1 = ['a', 'b', ['c', 'd'], ['e', 'f']];
var arr2 = [2, 0];
var arr3 = [3, 1];

console.log(getValue(arr1, arr2))
console.log(getValue(arr1, arr3))

-1赞 PeterKA 10/4/2022 #5

您可以按如下方式创建数组方法:Array#getNested

Array.prototype.getNested = function(index) { 
    let out = this; 
    index.forEach(i => out = out[i]); 
    return out; 
}

const arr1 = ['a', 'b', ['c', 'd'], ['e', 'f'], ['g',['h',['i', 'j']]]];
const arr2 = [2, 0];
const arr3 = [3, 1];
const arr4 = [4, 1, 1, 0];

console.log( arr1.getNested(arr2) );
console.log( arr1.getNested(arr3) );
console.log( arr1.getNested(arr4) );