gpt4 book ai didi

javascript - 获取排序列表中输入值范围内的两个数字

转载 作者:行者123 更新时间:2023-11-29 17:44:44 25 4
gpt4 key购买 nike

我想编写一个函数,给定一个排序的数字列表和一个随机数 X , 将返回一个新数组 [Y, Z]这样 Y <= X < Z .该函数还应处理输入值超出数组中所有随机数范围的边缘情况。

这是我想出的:

const getRange = (ranges, value) => {
let rangeTopIndex = ranges.findIndex(range => value < range);

// The value must be larger than the max value in range,
// use the last range.
if (rangeTopIndex == -1) {
rangeTopIndex = ranges.length - 1
}

// The value is smaller than the first value in range,
// use the second value in range as "top" in range.
if (rangeTopIndex == 0) {
rangeTopIndex = 1;
}

// Bottom index is always the index before top.
let rangeBottomIndex = rangeTopIndex - 1;
return [ranges[rangeBottomIndex], ranges[rangeTopIndex]]
};

这些是它应该处理的测试:

describe('getRange', function() {

it('should get the correct range', () => {

// In between two values
expect(getRange([0, 0.2, 0.7, 1] , 0.5)).toEqual([0.2, 0.7]);
expect(getRange([0, 0.2, 0.7, 1] , 0.1)).toEqual([0, 0.2]);
expect(getRange([0, 0.2, 0.7, 1] , 0.2)).toEqual([0.2, 0.7]);

// Edge cases
expect(getRange([0, 0.2, 0.7, 1] , 0)).toEqual([0, 0.2]);
expect(getRange([0, 0.2, 0.7, 1] , 1)).toEqual([0.7, 1]);

// Outside boundary of range
expect(getRange([0, 0.2, 0.7, 0.8] , 0.9)).toEqual([0.7, 0.8]);
expect(getRange([0.2, 0.3, 0.7, 0.8] , 0.1)).toEqual([0.2, 0.3]);

// Bonus if getRange can handle this (not necessary for my use case):
// expect(getRange([0.2, 0.3, 0.3, 0.8] , 0.3)).toEqual([0.3, 0.3]);

});
});

鉴于性能确实不是问题(ranges 长度将始终受到限制并且不会在热路径中执行),是否有更优雅的方式来编写此函数?

我所说的优雅是指使用更少代码行和/或功能更强大的东西。如果它能处理上面的“奖金”测试,那也很棒。

我觉得这可以在一行中完成?

Here is a带有 jasmine 测试的 CodePen 片段。

编辑:糟糕,刚刚看到奖金测试的输入值错误,完全不合逻辑。应该是expect(getRange([0.2, 0.3, 0.3, 0.8] , 0.3)).toEqual([0.3, 0.3]); .上面也固定了。

最佳答案

你可以使用递归:

const getRange = ([a, b, ...xs], value) => 
xs.length === 0 || value < b
? [a, b]
: getRange([b, ...xs], value);

它的工作原理是与第二个元素进行比较,如果它太小,则调用剩余的元素。

我专注于通过测试(让我们称之为“测试驱动”;)),但您可能想要涵盖一些明显的边缘情况(例如,输入少于 2 个元素)

关于javascript - 获取排序列表中输入值范围内的两个数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50589153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com