首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Underscore.js findWhere嵌套对象

Underscore.js findWhere嵌套对象
EN

Stack Overflow用户
提问于 2013-07-10 18:55:17
回答 4查看 37.1K关注 0票数 11

我有一个文件夹/文件的对象,如下所示:

代码语言:javascript
运行
复制
{
  about.html : {
    path : './about.html'
  },
  about2.html : {
    path : './about2.html'
  },
  about3.html : {
    path : './about3.html'
  },
  folderName : {
    path : './folderName',
    children : {
      sub-child.html : {
        path : 'folderName/sub-child.html'
      }
    }
  }
}

它可以达到6-7个层次的文件夹有孩子。

我希望找到path等于我提供的字符串的对象。不管它有多深。

我使用的是下划线,它只用于顶层:

代码语言:javascript
运行
复制
_.findWhere(files,{path:'./about2.html'}

我怎样才能进行深入的嵌套搜索。下划线是否有这方面的内容,还是我需要构建一个带有递归的混合体?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-07-10 20:10:23

这不是最漂亮的代码,但我测试了它,它似乎按照您的要求工作。它是设置为一个存档/下划线混音,但可以使用。用法如下:

代码语言:javascript
运行
复制
_.findDeep(testItem, { 'path': 'folderName/sub-child.html' })

执行情况:

代码语言:javascript
运行
复制
findDeep: function(items, attrs) {

  function match(value) {
    for (var key in attrs) {
      if(!_.isUndefined(value)) {
        if (attrs[key] !== value[key]) {
          return false;
        }
      }
    }

    return true;
  }

  function traverse(value) {
    var result;

    _.forEach(value, function (val) {
      if (match(val)) {
        result = val;
        return false;
      }

      if (_.isObject(val) || _.isArray(val)) {
        result = traverse(val);
      }

      if (result) {
        return false;
      }
    });

    return result;
  }

  return traverse(items);

}
票数 12
EN

Stack Overflow用户

发布于 2013-07-10 19:02:25

不要使用findWhere,而是使用filter,它将函数作为谓词而不是键值映射。使用递归函数检查当前节点和可能的子节点。就像这样:

代码语言:javascript
运行
复制
var searchText = './about2.html';

var recursiveFilter = function(x) {
    return x.path == searchText || 
        ( typeof x.children != 'undefined' && recursiveFilter(x.children['sub-child.html']) );
};

_.filter(files, recursiveFilter);

编辑

假设这是可行的,您可能想要创建一个函数getRecursiveFilter(searchText)。如下所示:

代码语言:javascript
运行
复制
function getRecursiveFilter(searchText) { 
    var recursiveFilter = function(x) {
        return x.path == searchText || 
            (typeof x.children != 'undefined' 
                && arguments.callee(x.children['sub-child.html']) );
    };
    return  recursiveFilter;
}

注意,在这里,recursiveFilter使用递归地调用自己

这是一个工作演示。

票数 9
EN

Stack Overflow用户

发布于 2014-05-01 18:27:00

这已经有了一个被接受的答案,但对于我类似的情况,这个答案非常清晰和完美:https://stackoverflow.com/a/21600748/1913975 _.filter +_.where

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17578725

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档