最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - Loop through multidimensional array with all unique IDs - Stack Overflow

programmeradmin3浏览0评论

I have a multidimensional array but the ID's are unique across parents and children, so I have a problem looping through using a for loop. The problem is that I cannot seem to grab the ID of the children. How do you think I should handle this?

    var Options = [
            {
                id: 0,
                children: []
            },
            {
                id: 2,
                children: []
            },
            {
                id: 3,
                children: [
                    {
                        id: 4,
                        children: []
                    },
                    {
                        id: 5,
                        children: []
                    },
                    {
                        id: 6,
                        children: []
                    }
                ]
            },
            {
                id: 7,
                children: [
                    {
                        id: 8,
                        children: []
                    },
                    {
                        id: 9,
                        children: []
                    }
                    ]
            }
        ];

I have kept the code concise for the sake of brevity. What I am trying to do is iterate through the array to pare ID's.

I have a multidimensional array but the ID's are unique across parents and children, so I have a problem looping through using a for loop. The problem is that I cannot seem to grab the ID of the children. How do you think I should handle this?

    var Options = [
            {
                id: 0,
                children: []
            },
            {
                id: 2,
                children: []
            },
            {
                id: 3,
                children: [
                    {
                        id: 4,
                        children: []
                    },
                    {
                        id: 5,
                        children: []
                    },
                    {
                        id: 6,
                        children: []
                    }
                ]
            },
            {
                id: 7,
                children: [
                    {
                        id: 8,
                        children: []
                    },
                    {
                        id: 9,
                        children: []
                    }
                    ]
            }
        ];

I have kept the code concise for the sake of brevity. What I am trying to do is iterate through the array to pare ID's.

Share Improve this question edited Dec 19, 2012 at 0:52 Chris Bier asked Dec 19, 2012 at 0:36 Chris BierChris Bier 14.5k19 gold badges69 silver badges106 bronze badges 2
  • Just pure javascript? No libraries? – qooplmao Commented Dec 19, 2012 at 0:37
  • 2 What do you mean you have a problem looping? You need to explain what your problem is. – epascarello Commented Dec 19, 2012 at 0:40
Add a ment  | 

3 Answers 3

Reset to default 6

This does not look like a "multidimensional array", but rather like a tree. Looping one level can be done with a simple for-loop:

for (var i=0; i<Options.length; i++) // do something

To loop the tree in-order, you will need a recursive function:

function loop (children, callback) {
    for (var i=0; i<children.length; i++) {
        callback(children[i]);
        loop(children[i].children, callback);
    }
}
loop(Options, console.log);

To get all children by their id, so that you can loop through the ids (regardless of the tree structure), use a lookup table:

var nodesById = {};
loop(Options, function(node) {
    nodesById[node.id] = node;
});
// access:
nodesById[4];

…and to loop them sorted by id, you now can do

Object.keys(nodesById).sort(function(a,b){return a-b;}).forEach(function(id) {
    var node = nodesById[id];
    // do something
});

How about recursion?

var findById = function (arr, id) {
    var i, l, c;
    for (i = 0, l = arr.length; i < l; i++) {
        if (arr[i].id === id) {
            return arr[i];
        }
        else {
            c = findById(arr[i].children, id);
            if (c !== null) {
                return c;
            }
        }
    }
    return null;
}

findById(Options, 8);

Ah, use recursion :D

var Options = "defined above";//[]
var OptionArray = []; //just as an example (not sure what you want to do after looping)
(function looper(start){
 for( var i = 0, len = start.length; i < len; i++ ){
  var currentOption = start[i];
  if( currentOption.id > 3 ){//could be more plex
   OptionArray.push(currentOption);
  }
  if( currentOption.children.length > 0 ){
   looper(currentOption.children);
  }
 }
})(Options);
发布评论

评论列表(0)

  1. 暂无评论