JavaScript算法-获取数组中面积最相似的对象
JavaScript Algorithm - Get the object with most similar area in array
我有以下对象
const originalObject = {
width: 1090,
height: 723,
}
以及这个对象列表
const validObjects = [
{
width: 1080,
height: 1080
},
{
width: 1080,
height: 1350
},
{
width: 1080,
height: 750
}
]
赠送以下帮手
const area = (width, height) => width * height;
我需要从 validObjects
中找到面积最接近原始物体的物体。
所以如果我这样做:
getMostSimilarObject(originalObject, validObjects)
我得到:
{
width: 1080,
height: 750
}
因为 area(1080, 750)
最接近 area(1090, 723)
有什么想法吗?
注意:在validObjects
中,只有大约3到10个对象。
您可以通过对两个对象的 width
和 height
属性的正差求和来确定两个对象的“相似”程度(我们称之为“得分”)。
考虑到这一点,我们可以通过获取与 originalObject
相关的得分最低的对象来找到最相似的对象。只需循环遍历列表,计算对象和循环遍历的项目的分数,如果分数低于目前记录的最低分数,则替换对象。
循环结束时的对象是最“相似”的对象。
const validObjects = [{
width: 1080,
height: 1080
},
{
width: 1080,
height: 1350
},
{
width: 1080,
height: 750
}
]
const originalObject = {
width: 1090,
height: 723,
}
function getMostSimilarObject(obj, list) {
let score;
let closest;
list.forEach(e => {
let objscore = Math.abs(obj.width - e.width) + Math.abs(obj.height - e.height)
if (!score || objscore < score) {
score = objscore;
closest = e;
}
})
return closest;
}
console.log(getMostSimilarObject(originalObject, validObjects))
我有以下对象
const originalObject = {
width: 1090,
height: 723,
}
以及这个对象列表
const validObjects = [
{
width: 1080,
height: 1080
},
{
width: 1080,
height: 1350
},
{
width: 1080,
height: 750
}
]
赠送以下帮手
const area = (width, height) => width * height;
我需要从 validObjects
中找到面积最接近原始物体的物体。
所以如果我这样做:
getMostSimilarObject(originalObject, validObjects)
我得到:
{
width: 1080,
height: 750
}
因为 area(1080, 750)
最接近 area(1090, 723)
有什么想法吗?
注意:在validObjects
中,只有大约3到10个对象。
您可以通过对两个对象的 width
和 height
属性的正差求和来确定两个对象的“相似”程度(我们称之为“得分”)。
考虑到这一点,我们可以通过获取与 originalObject
相关的得分最低的对象来找到最相似的对象。只需循环遍历列表,计算对象和循环遍历的项目的分数,如果分数低于目前记录的最低分数,则替换对象。
循环结束时的对象是最“相似”的对象。
const validObjects = [{
width: 1080,
height: 1080
},
{
width: 1080,
height: 1350
},
{
width: 1080,
height: 750
}
]
const originalObject = {
width: 1090,
height: 723,
}
function getMostSimilarObject(obj, list) {
let score;
let closest;
list.forEach(e => {
let objscore = Math.abs(obj.width - e.width) + Math.abs(obj.height - e.height)
if (!score || objscore < score) {
score = objscore;
closest = e;
}
})
return closest;
}
console.log(getMostSimilarObject(originalObject, validObjects))