比较Javascript数组对象并返回最近的一对
阵列1比较Javascript数组对象并返回最近的一对,javascript,Javascript,阵列1 [{ "index": 3, "ratio": 1.9310344827586208 }, { "index": 0, "ratio": 2.4122497055359244 }, { "index": 2, "ratio": 2.5 }, { "index": 1, "ratio": 1 }] 阵列2 [{ "index": 0, "ratio": 0.6670000000000006 }, { "index": 2, "ratio": 1
[{
"index": 3,
"ratio": 1.9310344827586208
}, {
"index": 0,
"ratio": 2.4122497055359244
}, {
"index": 2,
"ratio": 2.5
}, {
"index": 1,
"ratio": 1
}]
阵列2
[{
"index": 0,
"ratio": 0.6670000000000006
}, {
"index": 2,
"ratio": 1
}, {
"index": 3,
"ratio": 1
}, {
"index": 1,
"ratio": 2.409638554216892
}]
我想要这样的结果
从数组1的比率“2.4122497055359244”和数组2的比率“2.409638554216892”是最接近的一对
[{array1: 0, array2:1}, {array1: 1, array2:2}, ....]
可以迭代第一个数组并从第二个数组中获取最小的增量。如果多个项目最小,则两个项目都包含在结果集中 结果按最近的项目排序
函数增量(a,b){
返回Math.abs(a-b);
}
var array1=[{指数:3,比率:1.9310344827586208},{指数:0,比率:2.4122497055359244},{指数:2,比率:2.5},{指数:1,比率:1}],
array2=[{index:0,ratio:0.66700000000006},{index:2,ratio:1},{index:3,ratio:1},{index:1,ratio:2.409638554216892}],
结果=阵列1
.减少((r,a)=>r.concat(array2.减少((s,b)=>{
var d1=s和δ(a比率,b比率),
d2=s&&delta(a.比率,s[0].b.比率);
如果(!s | | d1a.delta-b.delta)
.map({a:{index:array1},b:{index:array2}}})=>({array1,array2}));
控制台日志(结果)代码>
.as控制台包装{最大高度:100%!重要;顶部:0;}
函数findneerestratio(项,数组){
var val=数组。减少((acc,curr)=>{
var差异=数学绝对值(当前比率项目比率);
return difference我想说这是javascripts.map()的一个很好的候选者。为什么用[php]标记它?为什么用[html]标记它?请停止添加不相关的标记以引起注意。@ThomasDeutschländer这都是关于逻辑而非技术语言它返回重复值什么是重复值?是否只需要一个具有相同增量的标记?它返回数组2的重复索引(索引应是唯一的),请检查我下面的答案以获得输出
function findNearestRatio(item,array){
var val = array.reduce((acc,curr)=>{
var difference = Math.abs(curr.ratio-item.ratio);
return difference<acc.diff?{diff:difference,item:curr}:acc;
},{diff:1000});
return val;
}
var sortFunc = (a,b) => {
if(a.difference<b.difference){
return -1;
}else if(a.difference>b.difference){
return 1;
}else{
return 0;
}
};
var array1 = [{ index: 3, ratio: 1.9310344827586208 }, { index: 0, ratio: 2.4122497055359244 }, { index: 2, ratio: 2.5 }, { index: 1, ratio: 1 }],
array2 = [{ index: 0, ratio: 0.6670000000000006 }, { index: 2, ratio: 1 }, { index: 3, ratio: 1 }, { index: 1, ratio: 2.409638554216892 }];
console.log(JSON.parse(JSON.stringify(array1)), JSON.parse(JSON.stringify(array2)));
var bestIndexArray = [];
while(array1.length) {
var closest = findNearestRatio(array1[0], array2);
closest.org = array1[0];
for (var j = 1; j < array1.length; j++) {
var closest2 = findNearestRatio(array1[j], array2);
if(closest2.item.index === closest.item.index && closest.diff > closest2.diff) {
closest2.org = array1[j];
closest = closest2;
}
}
bestIndexArray.push({array1: closest.org.index, array2:closest.item.index});
array1.splice(array1.indexOf(closest.org), 1);
array2.splice(array2.indexOf(closest.item), 1);
}
console.log(bestIndexArray);