【问题标题】:Search in a nested array and return a value from that array?在嵌套数组中搜索并从该数组中返回一个值?
【发布时间】:2018-06-26 19:34:08
【问题描述】:

我有一个 API 端点,它返回带有一堆游戏 ID 的 JSON 响应。该响应看起来像这样(是的,它被严重剪断了)。

{
"finished": [
        {
        "game_id": 8
        },
        {
        "game_id": 9
        },
        {
        "game_id": 11
        }
    ],
"unfinished": [
        {
        "game_id": 12
        },
        {
        "game_id": 13
        }
    ]
}

我想要实现的可能需要一堆单独的功能。但我想在数组中搜索用户输入的特定 ID。并根据它是在“完成”还是“未完成”中,从该键返回值。

假设我想在数组中搜索 ID 为 13。该 ID 将在“未完成”中找到。如果是这种情况,我想返回“未完成”数组中的第一个 ID,即 ID 12。

如果我要在数组中搜索 ID 9,将在“finished”中找到,然后返回该 ID (9)。

如果我要在数组中搜索 ID 12(将在“未完成”中找到),则返回未完成的第一个 ID,ID 12。

希望这是有道理的。

我一直在通过搜索数组进行一些测试,但一点运气都没有

const test = _.findKey(game_ids, function(o) { return o.game_id == 8; });

【问题讨论】:

  • 因此,如果已完成,则返回 id,如果未完成,则返回未完成数组中第一项的 id。如果什么都没找到怎么办?
  • 没错!如果没有找到,可能会再次返回未完成的第一个 ID。没想到这种情况=)

标签: javascript lodash


【解决方案1】:

如果在finished中找不到游戏id,则使用_.find()短路尝试未完成,如果没有找到则返回finished的第一个:

const data = {"finished":[{"game_id":8},{"game_id":9},{"game_id":11}],"unfinished":[{"game_id":12},{"game_id":13}]};

const findId = (game_id) => _.find(data.finished, { game_id }) || (_.find(data.unfinished, { game_id }) && data.unfinished[0]) || data.unfinished[0];

console.log(findId(13));

console.log(findId(9));

console.log(findId(200));
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js"></script>

【讨论】:

    【解决方案2】:

    因此,在基本级别上,您需要遍历两个数组以找到一些值。

    你提到了 lodash,它有一个 great find utility function。有了这个函数,你可以调用这个函数两次,每个数组调用一次。确保处理没有找到游戏的情况。

    例如:

    var targetVal = userInput; 
    game_id = _.find(apiResponse. finished, { game_id: targetVal })
    

    【讨论】:

      【解决方案3】:

      这是一个纯 JavaScript 解决方案:

      var response = {"finished":[{"game_id":8},{"game_id":9},{"game_id":11}],"unfinished":[{"game_id":12},{"game_id":13}]};
      
      function find(response, value) {
          var i;
          for (i = 0; i < response.finished.length; i++) {
              if (response.finished[i].game_id === value) {
                  return value;
              }
          }
      
          for (i = 0; i < response.unfinished.length; i++) {
              if (response.unfinished[i].game_id === value) {
                  return response.unfinished[0].game_id;
              }
          }
      
          return undefined;
      }
      

      【讨论】:

      • 谢谢!非常有帮助和教育!它适用于 =)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-07-31
      • 1970-01-01
      • 2013-08-29
      • 2023-04-09
      • 1970-01-01
      • 2013-02-19
      • 1970-01-01
      相关资源
      最近更新 更多