gpt4 book ai didi

javascript - 如何在 Javascript 中根据点到引用点的距离对点数组进行排序?

转载 作者:行者123 更新时间:2023-11-30 10:12:59 24 4
gpt4 key购买 nike

我有一个工作代码,在这里:

function simpleDist(pointA, pointB) {
var x = pointA.x - pointB.x,
y = pointA.y - pointB.y;

return Math.sqrt(x*x + y*y);
}

function sortByDist(pointRef, pointArray) {
var distancePairs = [],
output = [];

for(var p in pointArray) {
var pointComp = pointArray[p];

distancePairs.push([simpleDist(pointRef,pointComp), p]);
}

distancePairs.sort(function(a,b) {
return a[0]-b[0];
});

for(var p in distancePairs) {
var pair = distancePairs[p];

output.push(pointArray[pair[1]]);
}

return output;
}

这对我正在做的事情有效。但是,我想知道是否有使用 Array.sort() 的更简化的方法。我已经查看了 Array.sort() 的几种解释,似乎它需要接受 3 个函数来执行我需要的功能,而没有这里的解决方法。不过,我觉得我只是太笨了。您能找到使此功能更快或更简化的方法吗?

最佳答案

我认为您的方向基本正确。

如果您尝试针对代码行进行优化,那么您可以使用 Array.prototype.map减少一些样板数组代码。

使用 similar sorting implementation

function simpleDist(pointA, pointB) {
var x = pointA.x - pointB.x,
y = pointA.y - pointB.y;

return Math.sqrt(x*x + y*y);
}

var sortByDist = (function() {
var comparator = function(a,b) { return a.value - b.value; };

return function (pointRef, pointArray) {
var reorder = function(e) { return pointArray[e.index]; };
var distanceFromArray = function(b,i) {
return { index: i, value: simpleDist(pointRef, b) };
};
return pointArray.map(distanceFromArray).sort(comparator).map(reorder);
};
}());

我认为简化实现的唯一“直接”方法是使用 memoization优化对 simpleDist 的调用。

function simpleDist(pointA, pointB) {
var x = pointA.x - pointB.x,
y = pointA.y - pointB.y;

return Math.sqrt(x*x + y*y);
}

// fn(point) memoizer
var memoizer = (function(fn) {
var cache = {};
return function(pointB) {
var key = pointB.x + "|" + pointB.y; // simple key hashing
return cache[key] || (cache[key] = fn(pointB));
};
}());

function sortByDist (pointRef, pointArray) {
// partially apply pointRef to simpleDist and memoize
var distanceFrom = memoizer(function(pointB) { return simpleDist(pointRef, pointB); });

// sort
return pointArray.sort(function(a,b) {
return distanceFrom(a) - distanceFrom(b);
});
}

鉴于 simpleDist 是一个纯函数——相同的输入总是产生相同的输出——这里的 memoizer 可以防止您承担重复距离计算的成本。增加一点设置开销后,排序就变成了一个简单的比较器。

关于javascript - 如何在 Javascript 中根据点到引用点的距离对点数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25481717/

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