比较Javascript数组对象并返回最近的一对

比较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

阵列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);