下划线 - 基于值定位节点

underscore - locating node based in a value

本文关键字:定位 节点 于值 下划线      更新时间:2023-09-26

这是我第一次使用下划线...我有这个简单的json...

"categories" : [ 
    {
        "tag" : "cat1",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 1",
            "pt" : "Categoria 1"
        },
        "children" : [ 
            {
                "tag" : "cat11",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 1.1",
                    "pt" : "Categoria 1.1"
                }
            }, 
            {
                "tag" : "cat12",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 1.2",
                    "pt" : "Categoria 1.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat2",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 2",
            "pt" : "Categoria 2"
        },
        "children" : [ 
            {
                "tag" : "cat21",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 2.1",
                    "pt" : "Categoria 2.1"
                }
            }, 
            {
                "tag" : "cat22",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 2.2",
                    "pt" : "Categoria 2.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat3",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 3",
            "pt" : "Categoria 3"
        },
        "children" : [ 
            {
                "tag" : "cat31",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 3.1",
                    "pt" : "Categoria 3.1"
                }
            }, 
            {
                "tag" : "cat32",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 3.2",
                    "pt" : "Categoria 3.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat4",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 4",
            "pt" : "Categoria 4"
        },
        "children" : [ 
            {
                "tag" : "cat41",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 4.1",
                    "pt" : "Categoria 4.1"
                }
            }, 
            {
                "tag" : "cat42",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 4.2",
                    "pt" : "Categoria 4.2"
                }
            }
        ]
    }
]

你可以看到我在几个地方都有 TAG 键。我需要根据标签标准获取整个树。我正在使用,查找,过滤,在哪里和查找位置,并且一直得到相同的结果:

 var find = _.find($rootScope.webshop.categories, {tag: 'cat1'});

这行得通!

但如果我尝试...

 var find = _.find($rootScope.webshop.categories, {tag: 'cat11'}); 

没有结果:(即使使用 _.where 或 ._filter 或 ._findWhere。- 结果总是相同的。有人可以帮助下划线的初学者做一些可能很简单的事情吗?!

泰!

>_.find不递归,则必须构建自己的解决方案。像这样:

_.findIn = function() {
  var args = Array.prototype.slice.call(arguments, 0);
  var childrenProp = args[0];
  var result = _.find.apply(_, args.slice(1));
  if (result !== void(8)) return result;
  var arr = args[1];
  for (var i = 0, l = arr.length; i < l; i++) {
    args[1] = arr[i][childrenProp];
    var result = _.findIn.apply(_, args);
    if (result !== void(8)) return result;
  }
  return void(8);
}
_.findIn('children', categories, {tag: 'cat11'})

categories = [ 
    {
        "tag" : "cat1",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 1",
            "pt" : "Categoria 1"
        },
        "children" : [ 
            {
                "tag" : "cat11",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 1.1",
                    "pt" : "Categoria 1.1"
                }
            }, 
            {
                "tag" : "cat12",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 1.2",
                    "pt" : "Categoria 1.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat2",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 2",
            "pt" : "Categoria 2"
        },
        "children" : [ 
            {
                "tag" : "cat21",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 2.1",
                    "pt" : "Categoria 2.1"
                }
            }, 
            {
                "tag" : "cat22",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 2.2",
                    "pt" : "Categoria 2.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat3",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 3",
            "pt" : "Categoria 3"
        },
        "children" : [ 
            {
                "tag" : "cat31",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 3.1",
                    "pt" : "Categoria 3.1"
                }
            }, 
            {
                "tag" : "cat32",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 3.2",
                    "pt" : "Categoria 3.2"
                }
            }
        ]
    }, 
    {
        "tag" : "cat4",
        "active" : true,
        "order" : 10,
        "title" : {
            "en" : "Category 4",
            "pt" : "Categoria 4"
        },
        "children" : [ 
            {
                "tag" : "cat41",
                "active" : true,
                "order" : 10,
                "title" : {
                    "en" : "Category 4.1",
                    "pt" : "Categoria 4.1"
                }
            }, 
            {
                "tag" : "cat42",
                "active" : true,
                "order" : 20,
                "title" : {
                    "en" : "Category 4.2",
                    "pt" : "Categoria 4.2"
                }
            }
        ]
    }
]
_.findIn = function() {
  var args = Array.prototype.slice.call(arguments, 0);
  var childrenProp = args[0];
  var result = _.find.apply(_, args.slice(1));
  if (result !== void(8)) return result;
  var arr = args[1];
  for (var i = 0, l = arr.length; i < l; i++) {
    args[1] = arr[i][childrenProp];
    var result = _.findIn.apply(_, args);
    if (result !== void(8)) return result;
  }
  return void(8);
}
document.write(JSON.stringify(_.findIn('children', categories, {tag: 'cat11'})));
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>