基于属性的Javascript搜索

时间:2010-01-11 23:06:16

标签: javascript arrays

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

但是我有一些问题:

  1. Javascript没有关联数组。这些似乎是一个。是什么给了什么?
  2. 这似乎是一个非常优雅的解决方案,但它如何与竞争对手相抗衡?
    • “传递数组和比较功能” - 表示各种搜索的几种特定比较功能。
    • “优化的findByX功能” - 意味着针对所需的每种类型进行优化搜索。
    • scalalala方法” - 我怀疑它是最慢但最优雅的。
  3. 另外,您如何从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 个答案:

答案 0 :(得分:5)

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回调函数中指定的条件。

答案 1 :(得分:3)

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

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

如果要过滤掉继承的属性:

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

答案 2 :(得分:1)

如果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;
};