【问题标题】:How can get the closes object from object array?如何从对象数组中获取最近的对象?
【发布时间】:2020-05-22 18:34:54
【问题描述】:

我正在尝试从对象数组中获取最近的对象。如果没有匹配的元素,我想从数组中获取最接近的元素?以下是示例: 例如,假设数组如下:

const array = [
  { element1: 50, element2: 100, element3: 200, element4: 90 },
  { element1: 150, element2: 110, element3: 200, element4: 190 },
  { element1: 250, element2: 120, element3: 190, element4: 290 },
  { element1: 350, element2: 130, element3: 120, element4: 390 },
  { element1: 450, element2: 140, element3: 140, element4: 490 },
  { element1: 550, element2: 150, element3: 160, element4: 590 },
]

我将设置值设置为:{ element1: 60, element2: 100, element3: 200, element4: 100 },,

那么实际上,数组中没有与这个匹配的元素。那时,它会返回离它们最近的一个。在这种情况下,将返回第一个元素 - { element1: 50, element2: 100, element3: 200, element4: 90 }

【问题讨论】:

  • 您可以从定义最接近的含义开始。它是每个元素差异的总和吗?然后,您只需要遍历您的数组并检查您的目标。如果总和为 0,则您找到了完全匹配,否则您将继续与目标进行比较。但你应该先自己尝试,然后提出更具体的问题。
  • 是每个元素的个体差异还是每个对象所有属性的总和?
  • 是每个元素的个体差异

标签: javascript arrays object lodash


【解决方案1】:

您可以使用reduce,然后根据输出对值进行排序:

var array = [ { element1: 50, element2: 100, element3: 200, element4: 90 }, { element1: 150, element2: 110, element3: 200, element4: 190 }, { element1: 250, element2: 120, element3: 190, element4: 290 }, { element1: 350, element2: 130, element3: 120, element4: 390 }, { element1: 450, element2: 140, element3: 140, element4: 490 }, { element1: 550, element2: 150, element3: 160, element4: 590 }];

var settings = { element1: 60, element2: 100, element3: 200, element4: 100 };

var [difference, result] = Object.entries(array.reduce((acc, elem)=>{
  difference = 0;
  Object.keys(elem).forEach(k=>difference+=Math.abs(elem[k]-settings[k]));
  acc[difference] = acc[difference] || [];
  acc[difference].push(elem);
  return acc;
},{})).sort((a,b)=>a[1]-b[1])[0];

console.log(result);
console.log(difference)

【讨论】:

  • @pavel1117,当然,我也更新了我的答案,它现在将返回数组中最近元素的列表。我希望这会有所帮助。
【解决方案2】:
function objectDistance(obj1, obj2) {
  return (
    obj1.element1 +
    obj1.element2 +
    obj1.element3 +
    obj1.element4 -
    obj2.element1 -
    obj2.element2 -
    obj2.element3 -
    obj2.element4
  );
}

array.map(function (x) {
  objectDistance(x, toCompare);
});

此地图函数返回一个距离数组,您所要做的就是计算最小值并访问您的对象数组并返回它。 注意:不是js人,但概念应该是对的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-09
    • 1970-01-01
    • 1970-01-01
    • 2021-02-07
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    相关资源
    最近更新 更多