Underscore.js在嵌套数组中查找并返回元素

7
我有这样的数据结构:
[
    {
        "name": "AAAA",
        "children": [
            {"name": "vvv", "id": 3},
            {"name": "vvv22", "id": 4}
        ]
    },
    {
        "name": "BBBB",
        "children": [
            {"name": "ggg", "id": 5},
            {"name": "ggggv22", "id": 6}
        ]
    },
]

我希望您能够使用Underscore.js来查找并返回指定ID的子元素。如何实现呢?

不使用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;  
        }
     }
} 
2个回答

21
  1. 从顶层对象中Pluckchildren
  2. Flatten结果数组
  3. 找到第一个符合条件的对象,例如具有正确的id
  4. Chain这些操作

得到:

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

和一个演示

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>


我理解这个例子只会进入两层深度,是吗?我正在寻找一个可以处理可变深度的例子... - Bob
没错。对于变量深度,你可能会使用递归。如果找不到想要的东西,请随时提问。 - nikoshr
我正在尝试在findWhere语句中使用外部变量进行匹配,但似乎该变量对方法不可用。我该如何处理?谢谢。 - user2576960

4
我使用underscore编写了这个函数,可以完成您的工作。
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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接