老方法
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;
}
}
从代码中可以看出,for循环结束后this.goal
变量我们将拥有曼哈顿距离最小的食品。
Note: 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
成对的计算和对象,但不需要来自单独映射的额外循环(因为您不需要全部,只需要最少的一个)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)