[英]How to join two arrays according to their values
我有以下 arrays:
var main_arr = [[54.5,225.5], [45.25,15.54], [1.5, 22.3]];
var sec_arr = [[1.51, 22.35], [54.32,32.54], [4.56,45.45]];
我想获取第一个数组的最后一个元素,并通过第二个数组中的值找到最接近的元素。
然后我希望将找到的元素推入主数组并从辅助数组中删除。 我希望它重复,直到辅助数组中没有元素。
结果应如下所示:
[[54.5,225.5], [45.25,15.54], [1.5, 22.3], [1.51, 22.35], [4.56,45.45], [54.32,32.54]]
如何在没有任何框架的情况下使用纯 JavaScript 来做到这一点?
编辑:
我不确定我是否解释得足够好,所以我会给你一个更简单的版本。 您有一个主要和一个辅助数字数组。 您无法重新排序主目录中的任何内容。
var main = [1, 5, 4, 3, 7];
var secondary = [9, 3, 4, 0, 5];
我想获取最接近主数组最后一个元素的数字并将其推送到它。 然后应该重复它,直到辅助数组中没有元素。 结果应如下所示:
var main = [1, 5, 4, 3, 7, 9, 5, 4, 3, 0];
var secondary = [];
我将先给出一个代码示例,稍后再详细说明:
let main = [1, 5, 4, 3, 7];
let secondary = [9, 3, 4 0, 5];
for (var i = secondary.length; i > 0; i--) {
const lastElement = main[main.length-1];
const distance = secondary.map(item => calculateDistance(item, lastElement));
const index = indexOfMinValue(distance);
main.push(secondary[index]);
secondary.splice(index, 1);
}
function calculateDistance(item, lastElement) {
// calculate the distance (e.g. (x1-x2)^2 + (y1-y2)^2)
}
function indexOfMinValue(distance) {
return distance.reduce((iMin, x, i, arr) => x < arr[iMin] ? i : iMin, Number.POSITIVE_INFINITY);
}
由于您在每次迭代中从辅助数组中仅移动一个项目,因此您必须迭代辅助数组的长度(您不能使用for (var i = 0; i < secondary.length; i++)
,因为长度会在每次迭代。
然后,您必须计算所有元素相对于主数组的最后一个元素的距离。 对于单纯的数字,您只需对点进行简单的比较abs(lastElement - currentElement)
就必须使用评论中建议的公式。
这样,您将获得一个数组,其中包含您必须从中找到最小值的当前距离。 在第一次迭代的给定示例中,距离数组如下所示:
distance = [2, 4, 3, 7, 2];
indexOfMinValue
-函数(取自this answer )产生具有最小距离的元素的索引(本例中的第一个)。 使用该索引,您可以push
相应的值从辅助数组推送到主数组,并将其从辅助数组中删除。
indexOfMinValue
在其当前形式中产生具有最小距离的第一个元素。 可能需要随机产生最后一个结果或 select 最小值之一或...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.