javascript - 在不知道属性名称的情况下从对象数组中提取最小/最大值

标签 javascript arrays aggregate

我想从集合的所有属性中提取最小值和最大值:

"data": [
    {
        "food": 41000,
        "drinks": 60,
        "toys": 18961,
        "candy": 8740
    },
    {
        "food": 245,
        "abusive-usage": 96,
        "drinks": 5971,
        "candy": 12492,
        "somethingnew": 8
    },
    {
        "food": 365,
        "abusive-usage": 84,
        "toys": 22605,
        "candy": 9256,
        "somethingold": 1
    },
    {}
];

如果我提前知道属性名称,我可以这样做:

const max = Math.max(...graph.datasets.urgency.map((x) => x.knownPropertyName));

不幸的是,正如我试图通过上面的示例演示的那样,属性是动态的。我事先不知道其中会包含什么属性名称,我实际上也不关心;我只想要值的最小值和最大值。可以安全地假设所有值都保证是数字。

通过以下代码片段,我可以让它发挥作用:

    let maxUrgency = 0;
    let minUrgency = 0;
    data.forEach((day) => {
        Object.keys(day).forEach((key, index) => {
            if (day[key] > maxUrgency) maxUrgency = day[key];
            if (day[key] < minUrgency) minUrgency = day[key];
        });
    });

虽然它有效,但在这里简单地使用 for/forEach 似乎过于麻烦 - 而且可能不是最有效的。相反,我正在寻找一种更干净、更普通的方法(首选 ES6)来实现这一目标。例如,也许是基于 Array.prototype 的简洁 lambda 构造。最好,我不想使用像 lodash 或 underscore 这样的库。

如何改进这段代码,理想情况下这样我就不必遍历集合中每个项目的每个属性?

相关问题,但绝对不一样:

最佳答案

如果您不介意使用 ES2017,可以使用 Object.values()。与array.reduce()一起使用。

const data = [{
    "food": 41000,
    "drinks": 60,
    "toys": 18961,
    "candy": 8740
  },
  {
    "food": 245,
    "abusive-usage": 96,
    "drinks": 5971,
    "candy": 12492,
    "somethingnew": 8
  },
  {
    "food": 365,
    "abusive-usage": 84,
    "toys": 22605,
    "candy": 9256,
    "somethingold": 1
  },
  {}
]

const values = data.reduce((c, v) => [...c, ...Object.values(v)], [])
const min = Math.min(...values)
const max = Math.max(...values)

console.log(min, max)

或者,可以将 array.map()array.concat() 一起使用,而不是 array.reduce()

const data = [{
    "food": 41000,
    "drinks": 60,
    "toys": 18961,
    "candy": 8740
  },
  {
    "food": 245,
    "abusive-usage": 96,
    "drinks": 5971,
    "candy": 12492,
    "somethingnew": 8
  },
  {
    "food": 365,
    "abusive-usage": 84,
    "toys": 22605,
    "candy": 9256,
    "somethingold": 1
  },
  {}
]

const valueArrays = data.map(v => Object.values(v))
const values = Array.prototype.concat.call(...valueArrays)
const min = Math.min(...values)
const max = Math.max(...values)

console.log(min, max)

关于javascript - 在不知道属性名称的情况下从对象数组中提取最小/最大值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52105436/

相关文章:

javascript - 在 for 循环中将 <li> 节点替换为带有 h​​ref 的 anchor

r - 按组选择前 N 个值

javascript - 如何使用 material-ui 图标中的图标?

javascript - Chrome HTML5 <video> 请求 - 未发送 cookie

java - 从数组中拆分字符串的 double 值创建一个集合

arrays - 如何切片 BigQuery 数组 - 选择除最后一项以外的所有项目

c++ - VC++2010 似乎只在固定数组中分配一个 std::string

t-sql - 我可以将 PARTITION BY 与 GROUP BY 子句一起使用吗? SQL Server 2012

r - 按多列聚合,对一列求和并保留其他列?根据聚合值创建新列?

javascript - 设置实用程序类并在 vue 组件中使用它