首页 > 解决方案 > 在嵌套的对象数组中搜索js

问题描述

我有一个嵌套的对象数组,我试图在其中找到一个字符串。一旦我找到它,我想返回包含对象。 这是我的代码:

const myArray = [{
    label: "Home",
    last: "odlir",
    children: [{
        label: "Home 1",
        last: "odlir1",
        children: [{
          label: "Home 2",
          last: "odlir2"
        }, {
          label: "Home 3",
          last: "odlir3"
        }]
      },
      {
        label: "Home 4",
        last: "odlir4",
        children: [{
          label: "Home 5",
          last: "odlir5"
        }, {
          label: "Home 6",
          last: "odlir6"
        }]
      }
    ]
  },
  {
    label: "dash",
    last: "gom"
  },
  {
    label: "principal",
    last: "asd"
  }
];

function contain(obj, string) {
  if (obj == null)
    return false;

  if (obj.last == string)
    return obj;

  if (typeof obj.children == 'undefined')
    return false;

  for (let i = 0; i < obj.children.length; i++) {
    if (contain(obj.children[i], string))
      return obj;
  }
  return false;
}

function getObject(array, string) {
  for (let i = 0; i < array.length; i++) {
    if (contain(array[i], string)) {
      return array[i];
    }
  }
}

console.log('test', getObject(myArray, 'odlir6'));

我正在取回我想要的对象,父对象甚至祖父。这是此代码的堆栈闪电:https ://stackblitz.com/edit/js-hgchmx

标签: javascriptarraysobjectrecursion

解决方案


您可以采用递归方法并为每个嵌套调用存储 paren 对象。

  1. 声明result,稍后此变量包含父对象。

  2. 检查给定的变量是否不是null一个对象。没有就退出。

  3. 通过短路迭代对象的值并

    • 检查该值是否等于所需的字符串,然后返回对象的赋值。
    • 否则返回递归调用的结果。

function getObject(object, string) {
    var result;
    if (!object || typeof object !== 'object') return;
    Object.values(object).some(v => {
        if (v === string) return result = object;
        return result = getObject(v, string);
    });
    return result;
}

const
    array = [{ label: "Home", last: "odlir", children: [{ label: "Home 1", last: "odlir1", children: [{ label: "Home 2", last: "odlir2" }, { label: "Home 3", last: "odlir3" }] }, { label: "Home 4", last: "odlir4", children: [{ label: "Home 5", last: "odlir5" }, { label: "Home 6", last: "odlir6" }] }] }, { label: "dash", last: "gom" }, { label: "principal", last: "asd" }];

console.log(getObject(array, 'odlir6'));


推荐阅读