範囲値の配列があります[1,35]
。次に、2番目の配列には[2,5], [8,9]
、などの他の範囲があります。
ここで、最初からこれらの範囲を減算し、[1-1]
(2-5
取り出されたとおりに)次に、次に[6,7]
、のような値を取得する必要があります[10,35]
。
したがって、基本的には、2番目の配列から範囲を取得し、最初の配列からそれらを削除したいと思います。
これどうやってするの?
以下のES6機能が可能です。
これにより、最初の引数で複数の範囲を指定でき、重複する範囲がないと想定されます。関数の戻り値は、最初の引数に基づく配列ですが、2番目の引数で指定された範囲が削除されています。元の配列は、プロセス中に変更されません。
function subtractRanges(a, b) {
// Take deep copy of a and sort it
a = a.map( x => [...x] ).sort( (x, y) => x[0] - y[0] );
// Take shallow copy of b and sort it
b = [...b].sort( (x, y) => x[0] - y[0] );
var c = [], i = 0, j = 0;
while (i < a.length && j < b.length) {
var x = a[i], y = b[j];
if (y[0] > x[0]) {
c.push([x[0], Math.min(y[0]-1, x[1])]);
if (y[1] < x[1]) {
x[0] = y[1]+1;
j++;
} else {
i++;
}
} else {
if (y[1] >= x[1]) {
i++;
} else {
if (y[1] >= x[0]) {
x[0] = y[1]+1;
}
j++;
}
}
}
// Add remainder of a, and return
return [...c, ...a.slice(i)];
}
// Sample input
var a = [ [1,35] ];
var b = [ [2,5], [8,9] ];
// Get result
var result = subtractRanges(a, b)
// Output result
console.log(JSON.stringify(result));
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加