Вы можете очистить внутренний цикл, посмотрев на каждую клавишу и передав только значение. Также я предлагаю вытащить Object.keys(person).length
из цикла for, потому что он будет обрабатывать ключи каждого цикла. Если вы помещаете их в переменную и указываете, что это позволяет избежать переоценки ключей.
var groups = Object.keys(testData);
for(var i = 0; i<groups.length; i++){
var group = testData[groups[i]];
for(var j = 0; j<group.length; j++){
var personEntry = group[j];
var person_id = Object.keys(personEntry)[0];
console.log(person_id);
var personEntries = personEntry[person_id];
for(var k = 0; k<personEntries.length; k++){
var personValues = Object.values(personEntries[k]);
for(var l = 0; l<personValues.length; l++){
console.log(personValues[l]);
}
}
}
}
limits.h
имеет константы для макс. и минута возможных значений для целочисленных типов данных, можно проверить двойную переменную перед кастингом, как
if (my_double > nextafter(INT_MAX, 0) || my_double < nextafter(INT_MIN, 0))
printf("Overflow!");
else
my_int = (int)my_double;
РЕДАКТИРОВАНИЕ: nextafter()
решит проблему, упомянутую nwellnhof
Отвечать на Ваш вопрос: поведение, когда Вы бросаете из плаваний диапазона, не определено или конкретная реализация.
Разговор на основе опыта: я работал над системой MIPS64, которая не сделала реализовал подобные броски вообще. Вместо того, чтобы делать что-то детерминированное ЦП выдал исключение ЦП. Обработчик исключений, который должен эмулировать бросок, возвращенный, ничего не делая к результату.
я закончил со случайными целыми числами. Угадайте, сколько времени это взяло для прослеживания ошибки до этой причины. :-)
Вы лучше сделаете проверку принадлежности к диапазону сами, если Вы не будете уверены, что число не может выйти из допустимого диапазона.
Портативный путь к C++ состоит в том, чтобы использовать класс SafeInt:
http://www.codeplex.com/SafeInt
реализация будет допускать нормальное дополнение/вычитать/и т.д. на типе числа C++ включая броски. Это выдаст исключение каждый раз, когда и переполняются, сценарий обнаруживается.
SafeInt<int> s1 = INT_MAX;
SafeInt<int> s2 = 42;
SafeInt<int> s3 = s1 + s2; // throws
я высоко советую использовать этот класс в любом месте, где переполнение является важным сценарием. Это делает очень трудным постараться не тихо переполняться. В случаи, где существует сценарий восстановления для переполнения, просто поймайте SafeIntException и восстановитесь как соответствующие.
SafeInt теперь работает над GCC, а также Visual Studio
Другая опция состоит в том, чтобы использовать повышение:: numeric_cast, который допускает произвольное преобразование между числовыми типами. Это обнаруживает потерю диапазона, когда числовой тип преобразовывается и выдает исключение, если диапазон не может быть сохранен.
веб-сайт, на который ссылаются выше также, обеспечивает небольшой пример, который должен дать быстрый обзор того, как этот шаблон может использоваться.
, Конечно, это больше не плоскость C ;-)
Я не могу сказать Вам наверняка, определяется ли это для всех платформ, но это в значительной степени, что произошло на каждой платформе, которую я использовал. Кроме, по моему опыту, это прокручивается. Таким образом, если значение двойного является INT_MAX + 2, то, когда результат броска заканчивает тем, что был INT_MIN + 2.
Что касается лучшего способа обработать его, я действительно не уверен. Я столкнулся с проблемой сам и должен все же найти изящный способ иметь дело с нею. Я уверен, что кто-то ответит, что может помочь нам обоим там.
Я не уверен в этом, но я думаю, что может быть возможно "включить" исключения в операции с плавающей запятой для под/переполнять... смотрят на этот Контакт за Исключениями С плавающей точкой в MSVC7\8, таким образом, у Вас могла бы быть альтернатива если/еще проверки.