JavaScript 中 JSON 时间值的排列



>假设我有一个这样的JSON文件:

 {
"item1":{"time":"00:18:21"},
"item2":{"time":"00:22:22"},
"item3":{"time":"00:02:11"},
"item4":{"time":"01:34:32"}
}

我将如何找到项目组合时间总和的所有可能值,例如00:03:04 to 00:25:55之间存在,而不找到存在的每个排列组合并为该集合添加它们? 例如,第 1 项和第 3 项将在时间限制中找到,它们的时间加在一起00:20:32 .我尝试使用排列,但是使用更多对象会遇到某些缺点。如果我最多使用 7 个对象,显然需要超过 13,000 次迭代,将时间值相加并检查范围约束。我能做些什么来简化算法?

编辑:(你们要求提供一些背景信息(我正在尝试制作一个应用程序,该应用程序对长度为 hh:mm:ss 格式的视频集合进行排序,并生成具有给定时间长度的播放列表。

您可以检查所有组合是否适合给定的间隔。然后将其推送到结果数组。

function getCombinations(object, min, max) {
    function getTotalTime(a) {
        return a.map(a => getTimeValue(object[a].time)).reduce((a, b) => a + b, 0);
    }
    function getTimeValue(t) {
        return t.split(':').reduce(function (a, b) { return a * 60 + +b; });
    }
    function getTimeString(v) {
        return [60, 60, 1].map(t => [v % t, v = Math.floor(v / t)][0]).map(a => ('00' + a).slice(-2)).reverse().join(':');
    }
    function fork(i, t) {
        var total = getTotalTime(t);
        if (i === array.length) {
            if (minValue <= total && total <= maxValue) {
                result.push({ keys: t, time: getTimeString(total) });
            }
            return;
        }
        fork(i + 1, t.concat(array[i]));
        fork(i + 1, t);
    }
    var result = [],
        minValue = getTimeValue(min),
        maxValue = getTimeValue(max),
        array = Object.keys(object);
    fork(0, []);
    return result;
}
var data = { item1: { time: "00:18:21" }, item2: { time: "00:22:22" }, item3: { time: "00:02:11" }, item4: { time: "01:34:32" } },
    result = getCombinations(data, '00:03:04', '00:25:55');
console.log(result);
.as-console-wrapper { max-height: 100% !important; top: 0; }

最新更新