javascript - 下划线 - 基于值定位节点

标签 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 key 。我需要根据标签标准获取整个树。我使用 find、filter、where 和 findWhere,并且一直得到相同的结果:

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

这有效!

但如果我尝试...

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

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

我!

最佳答案

_.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>

关于javascript - 下划线 - 基于值定位节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27179905/

相关文章:

javascript - 使用javascript中的函数获取实时值

javascript - 使用原型(prototype)从对象内部调用对象上的函数

javascript - 查找数组中相同的对象,而不是删除它们

javascript - 如何使用 lodash 格式化数组数组

javascript - 如何使用 lodash/underscorejs 拆分具有特定条件的对象的 javascript 数组

javascript - 如何更改字符串的查找方法?

Javascript 在 PDF URL 中显示文件名而不是 blob 名称

javascript - 使用 jquery 的 data-id 属性?

node.js - Underscore.js _.extend 函数在架构中未定义时不会复制 mongoose 模型属性?

javascript - 网络钩子(Hook)是什么意思?