Обязательно используйте метод hasOwnProperty при итерации через свойства объекта:
for (p in anObject) {
if (anObject.hasOwnProperty(p)) {
//Do stuff with p here
}
}
Это сделано так, чтобы Вы только получили доступ прямые свойства anObject и не использовали свойства, которые снижаются на цепочку прототипа.
После краткого поиска в Интернете кажется, что оптимальная упаковка прямоугольников представляет собой NP-трудную проблему. Я предполагаю, что умные люди в академических кругах нашли для этого несколько алгоритмов аппроксимации, так что это вариант для поиска в Google.
Но я бы попытался сначала заставить работать простой метод:
Я предполагаю, что во многих случаях это простое решение будет работать.
Если я понимаю вопрос, похоже, вы ищете «оптимальный» алгоритм упаковки контейнеров (он же Задача о рюкзаке). Это проблема NP-Complete, хотя ваше описание звучит так, будто вы, вероятно, можете найти оптимальное решение грубой силой.
Я знаю, что это не конкретный ответ на ваш вопрос, но он может быть полезен для исследования и / или изучения исходного кода graphviz . graphviz предлагает несколько моделей компоновки, включая neato,