【问题标题】:Property based searches in JavascriptJavascript 中基于属性的搜索
【发布时间】:2010-01-11 23:06: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;
}

那么如何将它变成“关联”样式数组呢?

【问题讨论】:

  • 它不是使用关联数组,而是对象数组,它们完全不同。你说得对,JavaScript 没有关联数组
  • 只要键是字符串,简单的 javascript 对象就可以被视为关联数组(或更准确地说是哈希图)。
  • 我会避免扩展数组原型,而是编写一个实用函数/对象/构造函数来“封装”数组所需的按 x 查找功能

标签: javascript arrays


【解决方案1】:

JavaScript Array 对象应与数字顺序索引一起使用,但您可以使用普通对象,它们只是键/值对的集合。

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

请注意,此代码具有 jQuery 作为依赖项(它使用 $.grep)。

为了提高性能,我建议您使用标准的Array.prototype.filter 方法,现代浏览器提供了一种本机实现,与自定义实现相比,它非常快

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

这种方法真的很容易使用,现在是ECMAScript 5th Edition Specification (PDF) 的一部分(Section 15.4.4.20):

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

上面的代码将返回一个新的过滤数组,其中包含所有符合filter回调函数中指定条件的对象。

【讨论】:

  • 由于您提供了大部分信息,虽然不是所有答案,但您得到了打勾。
【解决方案2】:

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

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

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

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

【讨论】:

  • 所以我不能拥有{ name: "scala", type: "a", diff: "hard" } 或者我可以吗?
  • 您在评论中写出的对象没有问题。
【解决方案3】:

如果不存在过滤命令,可以使用以下代码添加 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;
};

【讨论】:

  • 我是该网站的新手。我如何让它为代码放置灰色区域而不是让它全部变成一行?
  • 您选择代码并单击编辑器上方的大括号图标。或者,您可以使用反引号来获得与被其他文本包围的 text 相同的效果。另外,请在编辑时查看右侧的帮助信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 2012-10-04
相关资源
最近更新 更多