lua 递归函数在 false 时获取 true 和 false

不确定发生了什么。我有一个从表中获取数据的递归函数。它发现一个键一开始为 true,之后两次变成了 false,但它本身还是 false。

我想检查 isActive 的布尔值。如果它为 false,则返回 false;如果为 true,则继续脚本。

DUMMY_DATA

    local DummyData = {
    data = {
        ['id'] = 34523456,
        ['question'] = '什么是牛奶?',
        ['isActive'] = true,
        ['questionCountdownTimerInSeconds'] = (60),
    }
}

RECURSIVE

    function FindQuestionInfo(Object)
    local Data = {
        ['id'] = '',
        ['question'] = '',
        ['isActive'] = truefalse,
        ['questionCountdownTimerInSeconds'] = (0),
    }

    for index, child in pairs(Object) do

        local ChildIsTable = type(child) == 'table'
        if not ChildIsTable then
            local isActive = index == 'isActive'

            local isId = index == 'id'
            local isQuestion = index == 'question'
            local isQuestionCountDDownTImerInSeconds = index == 'questionCountdownTimerInSeconds'

            if isQuestion then
                Data['question'] = child
            end

            if isId then
                Data['id'] = child
            end
        end

        if ChildIsTable then
            local FoundItem = FindQuestionInfo(child)
            if FoundItem then
                return FoundItem
            end
        end
    end

    return Data
end

PRINT

printIMAGE

原文链接 https://stackoverflow.com/questions/71051745

点赞
stackoverflow用户2858170
stackoverflow用户2858170

你的代码没有太多意义。我甚至不确定你想用它实现什么。

我来提几个问题:

['isActive'] = true or false

正如 Nifim 在他的评论中指出的那样 true or false 等于 true。所以你可以简单地这样做

['isActive'] = true

你不需要在数字周围加括号,就像 ['questionCountdownTimerInSeconds'] = (0) 一样

你没有说明你如何使用这段代码。我假设你调用了 FindQuestionInfo(DummyData)

那么我们来运行你的代码。首先你定义 Data

local Data = {
        ['id'] = '',
        ['question'] = '',
        ['isActive'] = true or false,
        ['questionCountdownTimerInSeconds'] = (0),
    }

然后你用通用的 for 循环和 pairs() 迭代器遍历了 Object 表格。假设 ObjectDummyData,这将在每个循环中给我们 DummyData 的键值对。

首先你检查 child(我们的值)是否为一个表。通过提供的代码,我不知道它怎么可能是一个表。如果它不是一个表,你会创建各种布尔值。

 local isActive = index == 'isActive'

 local isId = index == 'id'
 local isQuestion = index == 'question'
 local isQuestionCountDDownTImerInSeconds = index == 'questionCountdownTimerInSeconds'

然后你有条件地分配值。

if isQuestion then
     Data['question'] = child
   end
   if isId then
     Data['id'] = child
   end

所以只有当 index 等于其中一个键时,你才将相同的表字段从 Object 赋值到 Data。

整个循环看起来没有意义。如果你想要将一个表中的值分配给另一个表,你只需要将它们分配就可以了。你不需要遍历整个表,直到找到正确的键来分配。

除了你的 isTable 条件似乎总是为 false,你可以用以下方式代替那个 for 循环

Data.isQuestion = Object.isQuestion and Object.isQuestion or Data.isQuestion
Data.isId = Object.isId and Object.isId or Data.isId

因为如果它们存在于 Object 中,你只需赋值。

然后有这一部分,我无法理解,因为我不知道 child 怎么可能是一个表:

if ChildIsTable then
  local FoundItem = FindQuestionInfo(child)
  if FoundItem then
   return FoundItem
  end
end

同时 FindQuestionInfo(child) 总是返回 Data,所以条件

if FoundItem then
  return FoundItem
end

是不必要的。

所以除非你的 Object 中有一个你在示例中没有展示的表,我看不出为什么要有这段代码。特别是不该递归。

你只将 Object 的一部分复制到新的表 Data 中。

我也无法理解你的问题描述。

我假设你在这里问的是一个 xy 问题。所以我建议你问一个关于你正在尝试解决的实际问题的新问题,而不是关于如何修复这段代码的问题。

2022-02-09 16:57:57