旧的做法
let min = Number.MAX_VALUE;
for (let item of food) {
let current = Problem.manhattan_distance(player, item);
if (current > min){
min = current;
this.goal = item;
}
}
从代码中您可以看到,在 this.goal
变量中的 for 循环结束后,我们将获得曼哈顿距离最小的食物。
注意:Problem.manhattan_distance(player, item)
返回一个整数
我想使用 JavaScript 函数式编程达到相同的结果 也许是这样的事情
let smallest_mhd: number = food
.map((item) => Problem.manhattan_distance(player, item))
.reduce((a, b) => Math.min(a, b));
但这仅返回最小的数字,我想要的是具有最小数字的对象。
最佳答案
如果您的方法不是特别昂贵(例如简单的数学),您可以简单地执行以下操作:
const calcSomething = o => o.id;
const values = [{ id: 1 }, { id: 2 } , { id: 3 }];
const result = values.reduce((result, v) => calcSomething(v) < calcSomething(result) ? v : result);
console.log(result);
如果价格更贵,那么你可以这样做:
const calcSomething = o => o.id;
const values = [{ id: 1 }, { id: 2 } , { id: 3 }];
const result = values.reduce((result, obj) => {
const calc = calcSomething(obj);
return calc < result.calc ? { obj, calc } : result
}, { obj: null, calc: Number.MAX_VALUE });
console.log(result.obj);
这避免了重新运行计算。关键是要确保使用初始计算设置为最大值的对象来初始化它,因此它将被第一个循环覆盖。
第二种方法就像创建一个计算和对象对的 map
,但不需要来自单独映射的额外循环(因为您不需要所有这些,只需要至少一个)。
关于javascript - 如何使用 JavaScript 函数式编程从对象列表中找到具有最低属性的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50845210/