在JS中列出迭代

时间:2014-01-27 10:12:28

标签: javascript node.js mongodb

我有一个包含以下数据的列表:

{ 
  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);
    });
});

3 个答案:

答案 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.
}

Demo

答案 2 :(得分:0)

  1. 您粘贴的数据不是有效的JSON。

  2. 以下代码适用于node.js


  3. 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