>假设我有一个这样的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; }