代码之家  ›  专栏  ›  技术社区  ›  graham.reeds

javascript中基于属性的搜索

  •  1
  • graham.reeds  · 技术社区  · 15 年前

    在寻找用javascript搜索对象数组的最佳方法时(似乎没有迭代+比较函数),我来了 across this post 这似乎是一种非常优雅的方式。

    但是我有一些问题:

    1. javascript没有关联数组。这些看起来像一个。什么给予?
    2. 这似乎是一个非常优雅的解决方案,但它如何与竞争对手相提并论呢?
      • “传递数组和比较函数”—表示用于各种搜索的几个特定比较函数。
      • “优化的findbyx函数”—表示对所需的每种类型进行优化搜索。
      • 他说:“这是一个很好的选择。” scalalala 方法”——我想这是最慢但最优雅的方法。

    另外,如何从Ajax中获取响应并创建具有类似结构的数组?大多数教程手工挑选和滚动示例来演示数组的关联性,但实际上并不是如何使用。

    使用这种方法有什么缺陷吗?

    体面链接 beyond this )会很感激的。

    谢谢。

    更新: 这就是我遇到的问题。如果从服务器返回的数据与此类似:

    $.getJSON("map.php?jsoncallback=?", function(data) {
        for (var x=0,xx=data.stars.length; x<xx; x++) {
            stars.push( 
                new Star(
                    data.stars[x].id,
                    data.stars[x].xpos, data.stars[x].ypos,
                    data.stars[x].name, data.stars[x].owner
                )
            );
        }
    });
    

    其中star是一个类:

    function Star(id, x, y, n, o) {
        this.id = id;
        this.x = x; this.y = y;
        this.name = n;  this.owner = o;
    }
    

    那么,如何将其转换为“关联”样式数组呢?

    3 回复  |  直到 15 年前
        1
  •  5
  •   Christian C. Salvadó    15 年前

    Javascript数组对象应该与数字顺序索引一起使用,但是您可以使用纯对象,这只是键/值对的集合。

    在链接的代码中,函数查找数组中的对象。

    注意,此代码将jquery作为依赖项(它使用 $.grep )

    对于性能,我建议您使用标准 Array.prototype.filter 方法,现代浏览器提供 本机实现 那就是 真快 与自定义实现相比。

    为了兼容性(主要是IE),可以在上面的链接中包含方法实现。

    这个方法非常容易使用,现在是 ECMAScript 5th Edition Specification (PDF) 第15.4.4.20节 ):

    var filtered = existingArray.filter(function (obj) {
      return obj.property == someValue;
    });
    

    上面的代码会给你一个新的 已筛选 数组中包含与中指定的条件匹配的所有对象 filter 回调函数。

        2
  •  3
  •   Gabriel McAdams    15 年前

    在JavaScript中,所有对象都是名称-值对的集合。如果要循环访问对象的属性集合,请查看以下代码:

    for (var key in object) {
        alert(key + ':' + object[key]);
    }
    

    如果要筛选出继承的属性:

    for(var key in object) {
        if (object.hasOwnProperty(key)) {
            alert(key + ':' + object[key]);
        }
    }
    
        3
  •  1
  •   dandan78 Tom Cool    14 年前

    如果不存在与IE兼容的筛选器命令,则可以使用以下代码添加该命令:

    if (!new Array().filter) Array.prototype.filter = function (fnCallback) {
      var ret = new Array();
      var j = 0;
      for (var obj in this)
        if (fnCallback(obj)) ret[j++] = obj;
      return obj;
    };