在嵌套数组中搜索并从该数组返回一个值?

时间:2017-10-10 20:01:09

标签: javascript lodash

我有一个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,ID 12。

如果我要在数组中搜索ID 9,可以在“已完成”中找到,然后返回该ID(9)。

如果我要在数组中搜索ID 12,那么可以在“未完成”中找到,返回未完成的第一个ID,ID 12。

希望这是有道理的。

我一直在搜索数组进行一些测试,但根本没有运气

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

3 个答案:

答案 0 :(得分:1)

这是一个纯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;
}

答案 1 :(得分:1)

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

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

例如:

ServletOutputStream servletOutputStream = httpServletResponse.getOutputStream();
CsvWriterSettings csvWriterSettings = new CsvWriterSettings();
csvWriterSettings.setAutoConfigurationEnabled(true);
CsvWriter csvWriter = new CsvWriter(servletOutputStream, csvWriterSettings);
csvWriter.addValues(settlementSummaryDTOs);
httpServletResponse.setContentType("text/csv");
httpServletResponse.setHeader("Content-Disposition", "attachment; filename=settlement.csv");
csvWriter.flush();

答案 2 :(得分:1)

如果在完成时未找到游戏ID,则使用skb短路来尝试未完成,如果找不到任何内容则返回完成的第1个:

_.find()
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));