gpt4 book ai didi

javascript - 反转平面坐标数组

转载 作者:行者123 更新时间:2023-11-28 19:55:24 25 4
gpt4 key购买 nike

我有一个 (x,y) 坐标路径作为平面数组,如下所示:

[x1, y1, x2, y2, x3, y3, ...]

要将其从顺时针翻转为逆时针,我需要将其成对反转:x3,y3,x2,y2,x1,y1。以下内容有效并且启动速度相当快:

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];
for (var i = 0; i < (a.length/2); i = i + 2) {
var x = a[i];
var y = a[i+1];
a[i] = a[a.length - 2 - i];
a[i+1] = a[a.length - 1 - i];
a[a.length - 2 - i] = x;
a[a.length - 1 - i] = y;
};

但是有更优雅的方法吗?我玩了一会儿 splice,但它以数组形式返回拼接项,并希望它们作为参数返回,这会破坏一些东西:

for (var i = 0; i < (a.length/2); i = i + 2) {
a.splice(i, 0, a.splice(a.length-2-i, 2)); // doesn't work
};

虽然我认为您可以通过创造性地使用 apply 来解决这个问题,但是呃。

过滤 x 和 y 的数组,对每个数组调用反向并将它们拼接在一起似乎是可能的,但在 JS 中相当冗长,而且效率可能低很多。

编辑:数组是任意长度的,可能包含数十万对,因此速度和内存使用很重要。

最佳答案

如果使用两个计数器,一个从头开始,另一个从末尾开始,会更干净一些。

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];

for (var i = 0, j = a.length-2; i < j; i+=2, j-=2) {
var t1 = a[i],
t2 = a[i+1];
a[i] = a[j];
a[i+1] = a[j+1];
a[j] = t1;
a[j+1] = t2;
}
<小时/>

或者通过一点技巧,你可以缩短它一点。

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];

for (var i = 0, j = a.length-2; i < j; i+=2, j-=2) {
a[ i ] = [a[ j ], a[ j ] = a[ i ]][0];
a[i+1] = [a[j+1], a[j+1] = a[i+1]][0];
}
<小时/>

我们不要忘记解构赋值。这是 ECMAScript 6 中的功能,但现在也可以在 Firefox 中使用。

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];

for (var i = 0, j = a.length-2; i < j; i+=2, j-=2) {
[a[i], a[j], a[i+1], a[j+1]] = [a[j], a[i], a[j+1], a[i+1]];
}
<小时/>

另一种可能性是首先反转整个数组,然后反转数组对。

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];

a.reverse();

for (var i = 0; i < a.length; i+=2) {
var t = a[i];
a[i] = a[i+1];
a[i+1] = t;
}

可能更慢,但肯定更干净。

<小时/>

或者对结果使用单独的数组可以消除临时变量。

var a = ['x1', 'y1', 'x2', 'y2', 'x3', 'y3'];
var b = new Array(a.length);

for (var i = 0, j = a.length-2; i <= j; i+=2, j-=2) {
b[j] = a[i],
b[j+1] = a[i+1];
b[i] = a[j];
b[i+1] = a[j+1];
}

用全长初始化数组可以在现代实现中提高性能。

关于javascript - 反转平面坐标数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22678260/

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