【问题标题】:javascript recursive function giving errorjavascript递归函数给出错误
【发布时间】:2021-11-14 16:18:38
【问题描述】:

我的 JSON 结构如下所示,其中包含来自同一结构的键数组的下一个和上一个属性。

{
  "e6e1de44-d53b-44ae-9d52-8f6e1358f8ec": {
    "course": "Semester 1",
    "status": "completed",
    "next": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
    "previous": [],
  },
  "d1fc647b-ad7e-4b72-9269-5559948ee61d": {
    "course": "Semester 2",
    "status": "completed",
    "next": [
      "cb00b200-cee3-4ab8-af11-abb7ea26183b",
      "7b958370-d697-4536-9bff-fa564a5688ef"
    ],
    "previous": [
      "e6e1de44-d53b-44ae-9d52-8f6e1358f8ec"
    ],
  },
  "cb00b200-cee3-4ab8-af11-abb7ea26183b": {
    "course": "Semester 3",
    "status": "active",
    "next": [
      "72488692-064c-436c-93cb-8ebe2be7e168"
    ],
    "previous": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
  },
  "7b958370-d697-4536-9bff-fa564a5688ef": {
    "course": "Semester 4",
    "status": "active",
    "next": [
      "72488692-064c-436c-93cb-8ebe2be7e168"
    ],
    "previous": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
  },
  "72488692-064c-436c-93cb-8ebe2be7e168": {
    "course": "Final",
    "status": "not-started",
    "next": [],
    "previous": [
      "cb00b200-cee3-4ab8-af11-abb7ea26183b",
      "7b958370-d697-4536-9bff-fa564a5688ef"
    ],
  }
}

我试图以递归方式获取下一个数组和上一个数组,但它给了我一个错误 TypeError: Cannot read properties of undefined (reading 'recursiveFunc') 我正在调用这样的函数。

let nextRes = [];
recursiveFunc(courseData, 'e6e1de44-d53b-44ae-9d52-8f6e1358f8ec', nextRes, true);
let prevRes = [];
recursiveFunc(courseData, 'cb00b200-cee3-4ab8-af11-abb7ea26183b', prevRes, false);

我想知道是否可以使用相同的函数来实现类似的结果。这只是向前或向后遍历的问题。如何递归获取下一个数据的 id? nextRes 应该填充了 ['d1fc647b-ad7e-4b72-9269-5559948ee61d', 'cb00b200-cee3-4ab8-af11-abb7ea26183b', '7b958370-d697-4536-9bff-fa564a5688ef'-b648c-c-9692 8ebe2be7e168'] 和 prevRes 像 ['d1fc647b-ad7e-4b72-9269-5559948ee61d', 'e6e1de44-d53b-44ae-9d52-8f6e1358f8ec']

function recursiveFunc(data, parId, acc, forward) {
  for (let property in data) {
    if (data.hasOwnProperty(property) && typeof data[property] === 'object') {

      var current = data[property];

      if (forward && property == parId && typeof current.preReqStages === 'object' && data[property].next.length > 0) {
        acc.push(current.next);
      } else if (!forward && property == parId && typeof current.preReqStages === 'object' && data[property].previous.length > 0) {
        acc.push(current.previous);
      } else {
        this.recursiveFunc(data, property, acc, forward)
      }
    }
  }
}

【问题讨论】:

  • 所以你的意思是你试图从json中的数组中获取一个特定的键?并将其存储到 nextRes 或 prevRes 中,并且您想递归地执行此操作?

标签: javascript json recursion


【解决方案1】:

从您的代码顺序开始,如果您正在为 data 中的属性创建一个 for,则首先不需要验证 data.hasOwnProperty(property)

其次,您对 typeof current.preReqStages === 'object' 的验证应该是 typeof current.next === 'object'current.previous 用于下一个if,因为您没有preReqStages 的值。

然后,您将current.next 添加到您的数组中,这意味着您在数组中添加一个数组,而您只需要该值,所以我添加了一个forEach 并添加了每个值。

然后递归应该在匹配中,因为你想要得到的是所有的课程链,这意味着当你得到下一个时,你需要得到下一个新属性。所以我在forEach里面做了递归。

这是最终结果:

const courseData = {
  "e6e1de44-d53b-44ae-9d52-8f6e1358f8ec": {
    "course": "Semester 1",
    "status": "completed",
    "next": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
    "previous": [],
  },
  "d1fc647b-ad7e-4b72-9269-5559948ee61d": {
    "course": "Semester 2",
    "status": "completed",
    "next": [
      "cb00b200-cee3-4ab8-af11-abb7ea26183b",
      "7b958370-d697-4536-9bff-fa564a5688ef"
    ],
    "previous": [
      "e6e1de44-d53b-44ae-9d52-8f6e1358f8ec"
    ],
  },
  "cb00b200-cee3-4ab8-af11-abb7ea26183b": {
    "course": "Semester 3",
    "status": "active",
    "next": [
      "72488692-064c-436c-93cb-8ebe2be7e168"
    ],
    "previous": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
  },
  "7b958370-d697-4536-9bff-fa564a5688ef": {
    "course": "Semester 4",
    "status": "active",
    "next": [
      "72488692-064c-436c-93cb-8ebe2be7e168"
    ],
    "previous": [
      "d1fc647b-ad7e-4b72-9269-5559948ee61d"
    ],
  },
  "72488692-064c-436c-93cb-8ebe2be7e168": {
    "course": "Final",
    "status": "not-started",
    "next": [],
    "previous": [
      "cb00b200-cee3-4ab8-af11-abb7ea26183b",
      "7b958370-d697-4536-9bff-fa564a5688ef"
    ],
  }
}


function recursiveFunc(data, parId, acc, forward) {
  for (let property in data) {
    if (typeof data[property] === 'object') {
      var current = data[property];

      if (forward && property == parId && typeof current.next === 'object' && current.next.length > 0) {
        current.next.forEach(n => {
          if (!acc.includes(n)) {
            acc.push(n)
            this.recursiveFunc(data, n, acc, forward)
          }
        });
      } else if (!forward && property == parId && typeof current.previous === 'object' && current.previous.length > 0) {
        current.previous.forEach(p => {
          if (!acc.includes(p)) {
            acc.push(p)
            this.recursiveFunc(data, p, acc, forward)
          }
        });
      }
    }
  }
}


let nextRes = [];
recursiveFunc(courseData, 'e6e1de44-d53b-44ae-9d52-8f6e1358f8ec', nextRes, true);
console.log(nextRes)
let prevRes = [];
recursiveFunc(courseData, 'cb00b200-cee3-4ab8-af11-abb7ea26183b', prevRes, false);
console.log(prevRes)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-06-18
    • 2021-05-14
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多