2014-01-27 4 views
-1

У меня есть список с данными, такими как:Список итерация в JS

{ 
    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

Этот список данных типа JSON? –

+0

yes, im using mongoDB в настоящее время – n00b43677

+1

Это не действительно JSON и не массив, возможно, дважды проверьте вывод и вставьте его дословно. – Wil

ответ

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

В качестве альтернативы, как предложено, с помощью функции уменьшения, но эта функция не поддерживается IE8 без полизаполнения.

var maxTemp = data.reduce(function(a,b) { 
    return Math.max(a.Temperature, b.Temperature); 
}); 
console.log(maxTemp); 
+0

я думаю, что сокращение будет лучше :))) –

+0

@bitsMix Добавлена ​​версия с использованием функции 'Array.reduce'. :) – MildlySerious

+0

прохладный мужчина.:))))) –

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.

0
  1. данные, которые вы вставили, не являются действительными JSON.

  2. ниже код работает в 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

+0

Я думаю, что OP искал самую высокую температуру для каждого состояния. – Wil

+0

@Wil спасибо, логика обновлена ​​:) –

Смежные вопросы