代码之家  ›  专栏  ›  技术社区  ›  BenAlabaster

是否有jquery特性可以以类似于DOM的方式查询多维数组?

  •  9
  • BenAlabaster  · 技术社区  · 15 年前

    问题是。。。

    jQuery是否有任何方法允许您以与DOM类似的方式查询多维对象数组。

    例如,给我一个包含在多维数组中的对象列表,这个数组有一些匹配的属性值,比如StartOfPeriod大于指定的日期或者name==“Ben Alabaster”

    如果有什么东西已经存在的话,我想避免重新发明轮子。

    3 回复  |  直到 15 年前
        1
  •  6
  •   Matthew Flaschen    15 年前

    $.grep $.inArray ,这可能是有用的。 grep inArray 返回第一个匹配元素的索引,或-1。例如:

    var matches = $.grep(array, function(el){
      return el.StartOfPeriod > 2000;
    });
    

    这些方法类似于标准的ECMAScript方法, Array.filter 格雷普 )以及 Array.indexOf (类似于 伊纳雷 ); jQuery实际使用 数组.indexOf Array.every (所有元素匹配)和 Array.some (至少一个匹配项)。MDC有可以添加到项目中的代码,因此这些代码可以在没有本机实现的浏览器中工作。

        2
  •  2
  •   Jason McCreary    15 年前

    您可能会找到一个插件,但在jQuery核心中找不到。有几种有用的数组方法: each , unique inArray . 结合起来,您可以创建一些定制的东西来满足您的需求。

    您要搜索的更多的是一个具有类似xpath的遍历的集合库。Prototype有一组更大的数组方法。但可能还是无法满足你的实际需求。

    我同意你的看法 亚历克斯 ,这样的库/扩展将是有趣的。

        3
  •  1
  •   David Titarenco    15 年前

    我刚写了这个。。我认为它工作正常,但它肯定可以得到清理:)

    function findMatchingObjects(obj, member, value){
       var final = new Array();
       var temp = new Array();
       for(var p in obj){
        if (typeof obj[p] == 'object' ) {
         temp = findMatchingObjects(obj[p], member, value);
         if (temp.length == 1)
          final.push(temp[0]);
        }
        if (p == member && obj[p] == value) {
         final.push(obj);
        }
       }
       alert(final.length);
       return final;
    }
    

    var moo ={baz: 1, boo: 2, bar:{c1: 3, c2: 4, c3:{t:true, f:false, baz:1}},d: 11};
    var foo = findMatchingObjects(moo, "baz", 1);
    
    // did it work?
    console.log(foo);
    

    返回一个对象数组(或 子对象 foo 包含两者 moo c3 因为两个对象都包含 baz = 1

    使函数看起来像jQuery选择器只是一个语法糖的问题。