我想从集合的所有属性中提取最小值和最大值:
"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/