javascript - 如何使用 JavaScript 函数式编程从对象列表中找到具有最低属性的对象?

标签 javascript arrays performance

旧的做法

    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/

相关文章:

javascript - 如何嵌入音频

javascript - 如果在滚动条启动后插入内容,Nanoscroller 不会创建滚动条

Java从char数组中删除重复项的方法

javascript - jquery比较数组并返回不相同的值

c - 如何在消息到达时过滤/发送消息

javascript - 如何在 Firebase 中生成 "storageBucket"?

javascript - 应用 CSS :after with javascript (no jquery)

c - 从文件进行管道输入时,realloc 无法扩展 char 数组

python - 调试语句级性能的正确方法

c# - 如何阻止自定义性能计数器实例名称自动转换为小写