在寻找在Javascript中搜索对象数组的最佳方法时(似乎没有迭代+比较函数)我来across this post这似乎是非常优雅的方式
但是我有一些问题:
另外,您如何从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;
}
那么如何将其转换为“关联”样式数组?
答案 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;
};