-1

What I am trying to achieve is to allocate a panel to the column with the least amount of panels in it, and if 2 of the columns have an equal amount of panels then I take the first column and insert it there. I have attempted to implement this, which I will show below however I want to first address the problem that I am having. I understand that my code may have many flaws, and so I am open to suggestion on how to make it better. so the error I am getting through firebug is

TypeError: columns[leastItems] is undefined


return columns[leastItems].id;

and here is my javascript code that I have implemented:

    function DashboardAllocation() {
    var columns = document.querySelectorAll('.col-md-4.column');
    var noElemsInCol = new Array(columns.length);


    //Get count of children in each column into array
    for (var columnNumber = 0; columnNumber < columns.length; columnNumber++) {
        noElemsInCol.push(countChildren(columns[columnNumber]));
    }

    //Compare all values to see if they are all the same or if the first column is 0
    if (compareAllValues(noElemsInCol) || countChildren(columns[0] === 0)) {
        //if it is then return the first columns id
        return columns[0].id;
    }


    //Reference http://www.programmingsimplified.com/c/source-code/c-program-find-minimum-element-in-array
    var leastItems = 1;
    var minimum = countChildren(columns[0]);;

    for (var i = 1; i < noElemsInCol.length; i++) {
        if (noElemsInCol[i] < minimum) {
            minimum = noElemsInCol[i];
            leastItems = i + 1;
        }
    }

    return columns[leastItems].id;
}

//Compares all the values in the array to check if they are equal
//Reference http://stackoverflow.com/questions/9973323/javascript-compare-3-values
function compareAllValues(a) {
    for (var i = 0; i < a.length; i++) {
        if (a[i] === null) { return false }

        for (var j = 0; j < i; j++) {
            if (a[j] !== a[i]) { return false }
        }
    }

    return true;
}

function countChildren(Nodes) {
    var childrenCount = 0;
    for (var nodeType in Nodes.childNodes) {
        //if the nodetype is an element then we will add one
        if (nodeType == Node.ELEMENT_NODE) {
            childrenCount++;
        }
    }

    return childrenCount;
}

I have referenced the sources where I took code from and hope it helps to see where I am coming from and understand what I am trying to do

Johnathon64
  • 1,280
  • 1
  • 20
  • 45
  • Maybe you could debug the problem by looking at the value of `leastItem` and the size of `column` – Soren Jun 01 '15 at 11:51

1 Answers1

1

You are getting problem as an index leastItems of the array columns is out of range.

Currently You are getting error as in an array of [5] you are trying to fetch the sixth element, using leastItems variable

So either use change

var leastItems = 0;

OR, Use

return columns[leastItems -1 ].id;
Satpal
  • 132,252
  • 13
  • 159
  • 168