下划线 - 根据值定位节点

时间:2014-11-27 23:20:55

标签: javascript underscore.js

这是我第一次使用下划线...我有这个简单的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。 - 结果总是相同的。 有人可以帮助Underscore的初学者做一些可能很简单的事情吗?!

ty!

1 个答案:

答案 0 :(得分:1)

_.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'})

&#13;
&#13;
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'})));
&#13;
<script src="//cdnjs.cloudflare.com/ajax/libs/underscore.js/1.7.0/underscore-min.js"></script>
&#13;
&#13;
&#13;