简体   繁体   中英

Underscore.js Find and return element in nested array

I have data-structure like this:

[
    {
        "name": "AAAA",
        "children": [
            {"name": "vvv", "id": 3},
            {"name": "vvv22", "id": 4}
        ]
    },
    {
        "name": "BBBB",
        "children": [
            {"name": "ggg", "id": 5},
            {"name": "ggggv22", "id": 6}
        ]
    },
]

And I want to find and return child with given ID. How to achieve this using Underscore.js?

My current realisation without using Underscore:

for (var i = 0; i < data.length; i++) {
     var dataItem= data[i];
     for (var j = 0; j < dataItem.children.length; j++) {
        var child = dataItem.children[j];
        if (child .id == id) {
             return child;  
        }
     }
} 
  1. Pluck the children keys from your top level objects
  2. Flatten the resulting array
  3. Find the first object matching the condition, eg having the correct id
  4. Chain these operations

which leads to

var res = _(data).chain().
    pluck('children').
    flatten().
    findWhere({id: 3}).
    value();

And a demo

 var data = [ { "name": "AAAA", "children": [ {"name": "vvv", "id": 3}, {"name": "vvv22", "id": 4} ] }, { "name": "BBBB", "children": [ {"name": "ggg", "id": 5}, {"name": "ggggv22", "id": 6} ] } ]; var res = _(data).chain(). pluck('children'). flatten(). findWhere({id: 3}). value(); console.log(res);
 <script src="http://underscorejs.org/underscore-min.js"></script>

I got this function using underscore which will do your work.

var getChild = function(id,data){
    var allChildren = _.flatten(_.pluck(data,'children'));
    var childWithId = _.find(allChildren,function(child){return child.id == id});
    return childWithId;
}

var child = getChild(5,data);
console.log(child);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM