如何从嵌套数组中获取项的索引

问题描述 投票:-2回答:2

如何从嵌套数组中获取项目的索引,但不知道嵌套的深度,例如arr = [a,[b,[c],[d],e],f,[g],h]

javascript angular
2个回答
0
投票

如果我正确地理解了你的问题,你试图获得index例如值g

我创建了一个小脚本,通过数组迭代,可能嵌套数组,如果找到正确的value返回index

这是一个数组的屏幕截图,其中包含getIndexOfValue函数返回的键。

enter image description here

var arr = [
  "a",
  [
    "b",
    [
      "c"
    ],
    [
      "d"
    ],
    "e"
  ],
  "f",
  [
    "g"
  ],
  "h"
]

function getIndexOfValue(haystack, needle) {
  
  for(i in haystack) {
    if(haystack[i] instanceof Array) {
      result = getIndexOfValue(haystack[i], needle);
      if(result) {
        return result;
      }
    }
    else if(haystack[i] == needle) {
      return i;
    }
  }
  
  return false;
}
var indexOfA = getIndexOfValue(arr, "a");
var indexOfB = getIndexOfValue(arr, "b");
var indexOfC = getIndexOfValue(arr, "c");
var indexOfD = getIndexOfValue(arr, "d");
var indexOfE = getIndexOfValue(arr, "e");
var indexOfF = getIndexOfValue(arr, "f");
var indexOfG = getIndexOfValue(arr, "g");
var indexOfH = getIndexOfValue(arr, "h");
console.log(indexOfA); //0
console.log(indexOfB); //0
console.log(indexOfC); //0
console.log(indexOfD); //0
console.log(indexOfE); //3
console.log(indexOfF); //2
console.log(indexOfG); //0
console.log(indexOfH); //4

它可能仍然包含错误,我在几分钟内快速创建了它。


0
投票

要获取完整路径,可以对嵌套数组使用迭代和递归方法。

结果是一个包含所有索引的数组。

function findPath(array, value) {
    var path = [];

    array.some(function iter(p) {
        return function (a, i) {
            if (a === value) {
                path = p.concat(i);
                return true;
            }
            if (Array.isArray(a)) {
                return a.some(iter(p.concat(i)));
            };
        };
    }([]));

    return path;
}

var array = ['a', ['b', ['c'], ['d'], 'e'], 'f', ['g'], 'h'];

console.log(findPath(array, 'a'));
console.log(findPath(array, 'b'));
console.log(findPath(array, 'c'));
console.log(findPath(array, 'd'));
console.log(findPath(array, 'e'));
console.log(findPath(array, 'f'));
console.log(findPath(array, 'g'));
console.log(findPath(array, 'h'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
© www.soinside.com 2019 - 2024. All rights reserved.