我有一个包含以下数据的列表:
{
State: 'Florida',
Temperature: 83,
}
{
State: 'Florida',
Temperature: 82,
}
{
State: 'Florida',
Temperature: 79,
}
{
State: 'Nevada',
Temperature: 96,
}
{
State: 'Nevada',
Temperature: 93,
}
等等
列表按状态按字母顺序排序,并在每个状态从最高到最低温度排序。 如何遍历此列表以查找每个州的最高温度?
试试这个,但仍然无法运作:
var MongoClient = require('mongodb').MongoClient;
MongoClient.connect('mongodb://localhost:27017/weather', function(err, db) {
if(err) throw err;
var data = db.collection('data');
var cursor = data.find({});
cursor.each(function(err, doc) {
if(err) throw err;
if(doc == null) {
return db.close();
}
var maxTemp = data.reduce(function(a,b) {
return Math.max(a.Temperature, b.Temperature);
});
console.dir(maxTemp);
});
});
答案 0 :(得分:1)
这是一个使用循环的示例,假设您有一个包含对象的有效数组。
填充maxTemps
后,它看起来像这样:
{ Florida=83, Nevada=96}
以下是代码:
var maxTemps = {};
data = [{
State: 'Florida',
Temperature: 83,
},
{
State: 'Florida',
Temperature: 82,
},
{
State: 'Florida',
Temperature: 79,
},
{
State: 'Nevada',
Temperature: 96,
},
{
State: 'Nevada',
Temperature: 93,
}];
for(var i=0; i<data.length; i++) {
dataset = data[i];
if(maxTemps[dataset.State]) {
maxTemps[dataset.State] = Math.max(dataset.Temperature, maxTemps[dataset.State])
} else {
maxTemps[dataset.State] = dataset.Temperature;
}
}
或者,如果你不太关心数组本身的顺序,你可以按温度降序排序,并使用第一个元素来获得最大温度。
data.sort(function(a,b) {
return a.Temperature < b.Temperature;
});
console.log(data[0].Temperature);
或者,正如所建议的那样,使用reduce,但是没有polyfill的IE8不支持此功能。
var maxTemp = data.reduce(function(a,b) {
return Math.max(a.Temperature, b.Temperature);
});
console.log(maxTemp);
答案 1 :(得分:0)
创建一个对象。
var obj = {};
对于数组中的每个对象,如果对象没有与状态名称对应的键,请添加一个并将内容设置为空数组。然后推入温度。
arr.forEach(function (el) {
if (!obj[el.State]) obj[el.State] = [];
obj[el.State].push(el.Temperature);
});
最后,遍历对象并使用Math.max.apply
查找数组中的最大值:
for (var k in obj) {
console.log(k + ': ' + Math.max.apply(null, obj[k])); // Florida: 83, Nevada: 96.
}
答案 2 :(得分:0)
您粘贴的数据不是有效的JSON。
以下代码适用于node.js
:
var temperatureHistory = [{
State: 'Florida',
Temperature: 83,
},
{
State: 'Florida',
Temperature: 82,
},
{
State: 'Florida',
Temperature: 79,
},
{
State: 'Nevada',
Temperature: 96,
},
{
State: 'Nevada',
Temperature: 93,
}];
var max = temperatureHistory.reduce(function (topTemp, history) {
if (history.Temperature > topTemp[history.State] || -99999) {
topTemp[history.State] = history.Temperature;
}
return topTemp;
}, {});
console.log(max);
如果你想支持一些旧的浏览器,我建议underscore.js